Start here. This is the direct spoken answer to practice first.
Overview
A cache design is complete only when writes, expiry, concurrent misses, outages, and stale-data tolerance are defined.
I start with the freshness requirement and update path. For cache-aside reads, a miss loads from the source and stores the result; successful writes evict or update affected keys. TTL is a safety net and a business staleness limit, not the only invalidation strategy. Keys include tenant and authorization scope so cached results cannot cross boundaries.