System designLoading progress…

Stampedes and failures

Design a cache key, freshness policy and miss path while calculating load and mean-latency effects.

Stampedes and failures

At a 90% hit rate, 1,000 requests a second leave only 100 for the origin, and the mean latency is 0.9 × 2 + 0.1 × 50 = 6.8 ms. If the cache fails, all 1,000 land on an origin sized for 200: five times over. A hot key that expires can trigger a stampede, hundreds of simultaneous fills. Coalesce duplicate fills so one request loads and the rest wait, stagger expiry with jitter, and bound the fallback load by shedding what the origin cannot serve.

requests per second1000hit rate0.9origin capacity (req/s)200
mean latency at 2 ms hit / 50 ms miss: 6.8 ms origin load: 100 req/s against capacity 200 → 0.5× ok 500 concurrent misses on one hot key: 500 fetches at once

The hit rate hides how much the origin can really carry. When the cache fails or a hot entry expires, the full workload lands on a source sized only for misses. Coalesce duplicate fills, stagger expiry with jitter, and bound the fallback load.

Take the cache down and change the origin capacity.

Predict first. Can a high hit rate hide insufficient origin capacity?

Chapter context

A cache serves a previously obtained representation instead of repeating work. Its correctness depends on which requests can share a value and how long that value may remain useful. Fast retrieval of the wrong representation is still an error.

Chapter reference: math, worked example & code

This section belongs to the whole chapter, so it is the same on every lesson in it and may cover a different lesson's topic. The code for the experiment you just ran is inside the experiment itself.

Math and notation

If h is hit probability, t-hit hit-path time and t-miss complete miss-path time:

E[T]=h thit+(1−h)tmiss,Rorigin≈(1−h)R.E[T]=h\,t_{hit}+(1-h)t_{miss},\quad R_{origin}\approx(1-h)R.

The miss time here already includes lookup overhead. Means do not establish tail latency, and background refresh can add origin traffic.

Worked example

At 90% hits, 2-ms hit paths and 50-ms complete miss paths, mean latency is 0.9×2+0.1×50=6.8 ms. For 1000 requests/s, nominal origin demand is 100 requests/s. During a complete cache outage, it could become 1000 requests/s rather than remaining at the normal miss rate.

Reference code

The following example uses the Python standard library and does not call a remote service.

from math import isclose
hit=.9
assert isclose(hit*2+(1-hit)*50,6.8)
assert isclose((1-hit)*1000,100)
assert 1000/100 == 10

Python examples are provided for study and local execution; this page does not execute Python.

Common mistakes

A hit ratio is not a correctness guarantee. Mean latency does not reveal p95. Shared caching requires a safe identity and privacy policy; TTL does not replace authorization.