api-design
This skill should be used when the user needs to "design the API", do "endpoint design", pin down a "request/response shape",…
This skill should be used when the user asks about a "caching strategy", "cache invalidation", "what to cache", "read-through vs write-through vs write-back", "cache eviction" (LRU/LFU/TTL), "Redis vs Memcached", "stale reads", or hits "thundering herd", "cache stampede", "cache
Claude Code
$ npx -y skills add proyecto26/system-design-skills --skill caching --agent claude-code
Codex
$ npx skills add proyecto26/system-design-skills --skill caching -a codex -y
Cursor
$ npx skills add proyecto26/system-design-skills --skill caching -a cursor -y
Gemini CLI
$ npx skills add proyecto26/system-design-skills --skill caching -a gemini-cli -y
GitHub Copilot
$ npx skills add proyecto26/system-design-skills --skill caching -a github-copilot -y
OpenCode
$ npx skills add proyecto26/system-design-skills --skill caching -a opencode -y
Windsurf
$ npx skills add proyecto26/system-design-skills --skill caching -a windsurf -y
name: caching description: This skill should be used when the user asks about a "caching strategy", "cache invalidation", "what to cache", "read-through vs write-through vs write-back", "cache eviction" (LRU/LFU/TTL), "Redis vs Memcached", "stale reads", or hits "thundering herd", "cache stampede", "cache penetration", or "hot key" problems, or is choosing a Redis `maxmemory` eviction policy (allkeys-lru, volatile-lru, noeviction) vs TTL expiry for sessions or other cached state. Use it whenever a design is read-heavy or a datastore is overloaded by reads, even if the user doesn't say "cache".
Put a copy of hot data closer to the reader so most requests skip the slow path. Caching is the highest-leverage move for read-heavy systems — and the easiest to get subtly wrong, because a cache adds a second source of truth that can serve stale or wrong data, and can *amplify* an outage when it misbehaves.
Reads dominate (a high read:write ratio from `back-of-the-envelope`); the same data is read repeatedly; the datastore is the read bottleneck; or recomputation is expensive. A cache buys read latency and offloads the origin.
Write-heavy or read-once data (low hit rate — pure overhead). Data that must be exactly current with zero staleness (a cache is a stale copy by nature; when strict freshness is required, go to the source or use `consistency-coordination`). Don't add a cache before a number shows reads are the problem (YAGNI) — it's a new failure mode and a second thing to operate.
**Where to cache** (often layered): client/browser → CDN edge (→ `content-delivery`) → application/in-process → distributed cache (Redis/Memcached) → database buffer pool. This skill focuses on the application and distributed layers.
**Read strategy**
Use when reads are unpredictable; the default for most systems.
app code simple and caching policy centralized.
**Write strategy**
after writes must be fresh and slower writes are acceptable.
write-heavy/bursty paths that tolerate a small loss window.
written data is rarely re-read soon (avoids cache churn).
**Eviction policy**
**TTL** to bound staleness; **FIFO** rarely. Match the policy to the pattern.
| Option | What it solves | What it worsens | Change it when | |---|---|---|---| | Cache-aside | Simple, resilient (cache down ⇒ just slower) | First read per key is a miss; risk of stale after writes | Misses are too costly → read-through + warming | | Read-through | Centralized, clean app code | Couples app to cache lib; cold-start misses | Custom per-key load logic is needed | | Write-through | Fresh reads after write | Slower writes; writes cached data that may never be read | Writes dominate and aren't re-read → write-around/back | | Write-back | Fast, absorbs write bursts | Data loss window on crash; complex | Durability of recent writes is required | | Write-around | No churn from write-only data | Recently written keys miss on first read | That data IS read right after write → write-through | | TTL eviction | Bounds staleness automatically | Mass expiry can stampede the origin | Add jitter / soft-TTL refresh |
A cache that misbehaves doesn't just stop helping — it can take down the origin.
thousands of concurrent misses hit the store at once. *Mitigate:* per-key locks / request coalescing (single-flight), early/probabilistic refresh, TTL jitter.
time (often malicious). *Mitigate:* cache the negative result (short TTL), or a Bloom filter in front.
throughput. *Mitigate:* replicate the key across nodes, add a local/L1 tier, or shard the value.
the origin sees full load. *Mitigate:* warm critical keys; ramp traffic.
invalidate on write, or write-through, or short TTL — pick per staleness budget.
**Monitor:** hit rate, p99 latency, eviction rate, key distribution (hot spots), and origin QPS during cache restarts.
1. **Clarify the inputs** — confirm the read:write ratio, staleness budget, and hot-set size (see *Clarify first*). If no number yet shows reads are the bottleneck, stop — a cache is not needed yet (→ `back-of-the-envelope`). 2. **Pick the strategies from the trade-off table** — choose a read strategy (cache-aside is the default), a write strategy keyed to the staleness budget, and an eviction policy matched to the access pattern. 3. **Set the key knobs** — define the key naming scheme, TTL (with jitter), and the per-key-family invalidation event. Decide negative-caching and single-flight up front, not after the first incident. 4. **Stress-test the choice** — walk each failure i
Made in code with Remotion — the same scenes power the site's hero (site/src/motion/). Design scalable systems the way strong engineers actually do — by reasoning, not by memorizing diagrams.
This skill should be used when the user needs to "design the API", do "endpoint design", pin down a "request/response shape",…
This skill should be used when a system design needs a diagram — "draw the architecture", "diagram this system", "show the…
This skill should be used when the user needs to "estimate QPS", "back-of-the-envelope" (BOTEC) numbers, "how much storage /…
This skill should be used when the user wants a "blob store" or "object storage", names "S3" or an S3-compatible store, needs to…
This skill should be used when the user asks about the "CAP theorem", "PACELC", a "consistency model", "eventual vs strong…
This skill should be used when the user asks about a "CDN", "edge caching", "static asset delivery", "media / video delivery",…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.