A product's price is cached with cache-aside (read: check cache, miss goes to DB, populate cache; write: update DB, delete cache entry). A customer reports seeing the old price for an hour after an admin changed it, even though the cache delete clearly ran. Walk through how this happens and how you'd close it.
The race: a reader misses the cache and reads the old price (100) from the database, but is paused for a few milliseconds (GC, a slow network) before writing it into the cache. In that gap, an admin updates the database to the new price (120) and deletes the cache entry — which does nothing, since there was nothing cached yet. The paused reader then resumes and writes the stale value (100) into the cache. Every step individually did what it should; the interleaving produced a cache entry older than the database, and it stays wrong until the TTL expires. A TTL bounds the damage but doesn't prevent it — closing the race needs versioning the cached value and refusing to overwrite a newer version with an older one, or simply not caching data where a stale read is a correctness problem.