Redis Key 过期与淘汰策略
相关概念:Redis
Redis 里“一个 Key 会不会消失”通常要分两件事看:
- 这个 Key 是否已经过期
- 当前实例是否因为内存压力需要主动淘汰 Key
过期删除
Redis 不是给每个 Key 单独挂一个定时器,而是组合使用两种方式:
- 惰性删除:访问到某个 Key 时,才检查它是否过期
- 主动过期:后台周期性抽样扫描带过期时间的 Key,并清理其中已经过期的部分
这也是为什么“设置了 TTL”不等于“到点立刻从内存里消失”。
内存淘汰
当内存使用超过 maxmemory 后,Redis 才会启动淘汰策略。
常见策略可以粗略记成:
volatile-lru:只在设置了过期时间的 Key 中按 LRU 淘汰allkeys-lru:在所有 Key 中按 LRU 淘汰volatile-random:在带过期时间的 Key 中随机淘汰allkeys-random:在所有 Key 中随机淘汰volatile-ttl:优先淘汰更快过期的 Keynoeviction:不淘汰,直接报错
一个容易混淆的点
过期删除和内存淘汰不是同一件事:
- TTL 解决的是“这个数据什么时候不再有效”
- 淘汰策略解决的是“内存不够时先丢谁”
如果把这两件事混在一起理解,排查缓存异常时很容易跑偏。
主从复制里的直觉
在复制场景里,过期行为最终要以主节点的状态传播为准,所以不要把“从节点是不是自己删了 Key”当成设计前提。
真正该关心的是:
- 主节点的 TTL 是否设置合理
- 内存上限和淘汰策略是否符合业务预期