Skip to content
极高进阶

一句话答案

过期策略:惰性删除(访问时检查)+ 定期删除(随机抽样);淘汰策略 8 种:LRU/LFU/TTL/Random × volatile/allkeys。

核心要点

Redis 采用两种策略结合:惰性删除 + 定期删除

1. 惰性删除(Lazy Expiration)

  • 不主动删除过期 key,只在访问时检查是否过期
  • 过期了 → 删除并返回 null
  • 优点:对 CPU 负担小(按需检查)
  • 缺点:如果 key 一直不被访问,即使过期也占着内存(内存泄漏风险)

2. 定期删除(Periodic Expiration)

  • Redis 每隔一段时间(默认 100ms,由 hz 配置)随机抽取一批设置了过期时间的 key
  • 检查并删除其中已过期的 key
  • 如果抽取的 key 中过期比例超过 25%,重复执行直到比例降下来或超时
  • 优点:可以主动回收过期内存
  • 缺点:随机抽样,不保证所有过期 key 都及时删除

两种策略为什么结合:

  • 只有惰性删除 → 内存持续增长(不被访问的过期 key 积压)
  • 只有定期删除 → CPU 开销大,且抽样有遗漏
  • 两者结合:定期删除兜底回收内存,惰性删除保证访问时一定返回正确结果
追问与易错

追问方向:

  • 惰性删除和定期删除各自的问题?(惰性不及时占内存,定期 CPU 开销)
  • LRU 和 LFU 怎么选?(LFU 更精确但实现复杂,Redis 4.0+ 支持)
  • 如果不设过期时间,内存满了怎么办?(触发淘汰策略,默认 noeviction 拒绝写入)

易错点:

  • ❌ "过期的 key 立即被删除"——惰性+定期,可能已过期但还在内存中
  • ❌ 混淆 volatile 和 allkeys 前缀——volatile 只淘汰设了过期时间的 key

💡 记忆锚点

过期删除 = 惰性+定期双保险:惰性是"来了才查身份证",定期是"每100ms随机抽查一批"。淘汰策略记两个维度:范围(allkeys全部/volatile仅有TTL的) x 算法(LRU最久未用/LFU最少使用/TTL最快过期/Random随机)。