外观
一句话答案
过期策略:惰性删除(访问时检查)+ 定期删除(随机抽样);淘汰策略 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随机)。