Skip to content

Redis 过期删除与内存淘汰

一句话机制:过期删除管「过期 key 何时真正消失」(惰性+定期,不用定时);内存淘汰管「内存不够写新数据时踢谁」(8 种策略,4.0 后含 LFU)。二者是两套独立机制。

不变量(必须成立的约束)

  • 过期删除只用惰性删除expireIfNeeded,访问时才删)+ 定期删除activeExpireCycle,周期性随机抽查),不用定时删除(CPU 不友好)。
  • 内存淘汰 8 种(Redis 4.0+):
    • 全局:noeviction(默认,写报错)、allkeys-lruallkeys-lfuallkeys-random
    • 仅过期 key:volatile-lruvolatile-lfuvolatile-randomvolatile-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 同步,故主从延迟时可能读到「逻辑已过期」数据。

关联

最近更新