主题
Redis 过期删除与内存淘汰
一句话机制:过期删除管「过期 key 何时真正消失」(惰性+定期,不用定时);内存淘汰管「内存不够写新数据时踢谁」(8 种策略,4.0 后含 LFU)。二者是两套独立机制。
不变量(必须成立的约束)
- 过期删除只用惰性删除(
expireIfNeeded,访问时才删)+ 定期删除(activeExpireCycle,周期性随机抽查),不用定时删除(CPU 不友好)。 - 内存淘汰 8 种(Redis 4.0+):
- 全局:
noeviction(默认,写报错)、allkeys-lru、allkeys-lfu、allkeys-random - 仅过期 key:
volatile-lru、volatile-lfu、volatile-random、volatile-ttl
- 全局:
- 主从复制下:从节点不主动删过期 key,由主节点删后发
DEL同步;3.2 前从节点可能返回已过期数据。 - 默认
maxmemory-policy = noeviction;不设maxmemory时超出物理内存会 swap,性能骤降。
关键证据 / 例子
noeviction满时拒绝写入并返回 OOM 错误,只响应读。volatile-ttl:过期时间越早越先踢;allkeys-lru:最久未访问先踢(推荐搭配)。- LRU vs LFU:LRU 看「最近一次访问时间」,偶发批量会污染缓存;LFU 看「访问频次」,抗突发更好(4.0 新增)。
- 过期删除与内存淘汰互不影响:过期策略处理时间维度,淘汰策略处理空间维度。
常见误解
- ❌「内存淘汰策略有 6 种」——这是 Redis 4.0 之前的旧说法。4.0 新增
volatile-lfu/allkeys-lfu两种,共 8 种;老资料说 6 种属过时。 - ❌「过期 key 到点就自动删」——不是定时删除;若一直不被访问,惰性删除不会动它,靠定期删除兜底,可能短期残留。
- ❌「LRU 和 LFU 差不多」——LRU 易被一次性全量扫描污染;热点场景 LFU 更稳。
- ❌「主从架构下从库自己清过期 key」——从库不主动删,依赖主库 DEL 同步,故主从延迟时可能读到「逻辑已过期」数据。
关联
- 来源:Redis常见面试题(含面试-叶明确的「4.0 前后 6→8 种」说明)
- 相关:Redis技术栈总览、概念卡片:Redis高可用-主从哨兵集群