Most cache tuning conversations stop at eviction. That is the wrong place to stop. An eviction policy such as LRU or LFU only runs when the cache is at its memory limit, and it answers one narrow question: which entry leaves to make room for a new one. LRU evicts whatever was touched longest ago, and LFU evicts whatever was touched least often, with recency as a tiebreaker in the Redis comparison. Neither policy has any notion of correctness over time. A popular entry that was invalidated at the source five minutes ago stays in a roomy cache indefinitely, because nothing forced it out.
TTL is the mechanism that closes that gap. It sets an absolute deadline per entry, measured from the moment the entry was written, and applies whether the cache is 2 percent full or 100 percent full. Tellius documents the distinction cleanly in its own product: an in-memory dataset with a 44-minute TTL expires at the 44-minute mark even if it was read at minute 30, and a 2 GB size limit with LRU clearing runs separately from that clock in the Tellius documentation. Two independent mechanisms, two independent failure modes.
That separation matters for a two-layer stack. With a local cache inside your process and a provider cache upstream, you have two clocks and two capacities, and the combination produces failure modes that neither layer shows alone. The work is not choosing one global TTL. It is building a matrix: rows are source types, columns are layers, each cell is a duration you can defend.
A useful mental model is that eviction protects memory and TTL protects truth. Eviction is about efficiency. TTL is about correctness. If you only tune eviction, your cache stays fast and slowly becomes wrong.



