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:优先淘汰更快过期的 Key
  • noeviction:不淘汰,直接报错

一个容易混淆的点

过期删除和内存淘汰不是同一件事:

  • TTL 解决的是“这个数据什么时候不再有效”
  • 淘汰策略解决的是“内存不够时先丢谁”

如果把这两件事混在一起理解,排查缓存异常时很容易跑偏。

主从复制里的直觉

在复制场景里,过期行为最终要以主节点的状态传播为准,所以不要把“从节点是不是自己删了 Key”当成设计前提。

真正该关心的是:

  • 主节点的 TTL 是否设置合理
  • 内存上限和淘汰策略是否符合业务预期