Redis 过期删除三大策略详解

Redis 过期删除三大策略详解:定时 / 惰性 / 定期淘汰原理深度对比

Redis 的内存管理,归根结底是一场时间与空间的博弈。当一个 key 设置了过期时间,它就成了一颗定时炸弹------什么时候拆?怎么拆?拆得干不干净?这三个问题,催生了三种截然不同的策略。


一、三种策略的核心逻辑

策略 一句话概括 谁来拆? 什么时候拆?
定时删除 到点就炸,绝不拖延 定时器 过期瞬间
惰性删除 你不碰我,我就不死 访问者 每次读写时
定期删除 保安定时巡逻,发现过期就清 后台任务 每隔一段时间

二、逐策略深度拆解

1. 定时删除(Active Expiration)------时间换空间

原理: 给每个设置过期时间的 key 挂一个定时器,到期立即触发删除。

优点: 干净利落,过期即删,内存利用率最高。

致命缺陷: 假设有 100 万个 key 同时过期,100 万个定时器同时触发,CPU 瞬间被打满。Redis 的核心目标是高性能,绝不能为了内存牺牲 CPU。

结论:Redis 没有采用这种策略。


2. 惰性删除(Lazy Expiration)------空间换时间

原理: key 过期了不管它,等你下次来访问时,先检查是否过期,过期就删,返回 null。

实现入口是 expireIfNeeded() 函数,每个读写命令执行前都会调用:

复制代码
复制代码
`1客户端发来 GET mykey
2  → 查过期字典,发现有过期时间
3  → 当前时间 > 过期时间?
4    → 是:删除 key,返回 nil
5    → 否:正常返回值
6`

优点: 零额外 CPU 开销,不扫描、不遍历,实现极其简单。

致命缺陷 : 如果一个 key 过期后永远没人访问,它就永远躺在内存里。大量过期 key 堆积,就是一场静默的内存泄漏。

单独使用不可行,必须搭配定期删除兜底。


3. 定期删除(Periodic Expiration)------折中之王 ⭐

原理 : Redis 的 serverCron 定时任务(默认每秒 10 次,即每 100ms 一次)主动出击,随机抽取过期字典中的 key 检查是否过期,过期则删。

具体执行逻辑(activeExpireCycle 函数):

参数 默认值 含义
每次扫描的 key 数 20 个 随机抽取,不遍历全部
过期比例阈值 25% 超过则继续扫,否则换库
单次最大耗时 25ms(slow 模式) 超时即停,不阻塞主线程

为什么是随机抽样而不是全量遍历?

假如 Redis 存了几千万个 key,全量遍历一次要几分钟,服务直接瘫痪。随机抽 20 个,既能逐步清理,又不影响正常请求。


三、Redis 的真实组合拳:惰性 + 定期 + Fast 模式

Redis 实际采用的是 惰性删除 + 定期删除 的组合策略,且内置了双模式自适应调节:

特性 Slow 模式(默认) Fast 模式(触发型)
执行频率 每秒 10 次 最高每秒 1000 次(每 1ms 一次)
单次最大执行时间 25ms 1ms
触发条件 定时触发 上一次 slow 模式中过期 key 比例 > 25%
适用场景 正常业务 大量 key 同时过期(如秒杀结束)
CPU 占用

组合逻辑

  • 定期删除负责"主动巡逻",清理大部分长期未访问的过期 key,控制内存整体水位。
  • 惰性删除负责"最后把关",任何被访问的 key 必定是干净的,绝不返回过期数据。

两者配合,既不让 CPU 空转,也不让内存膨胀------这才是 Redis 高性能的精髓所在。


四、三策略优劣总对比

维度 定时删除 惰性删除 定期删除 Redis 实际方案
内存效率 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
CPU 效率 ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐
实现复杂度
内存泄漏风险 极低
是否采用 ✅(组合)

五、关键配置参数

参数 默认值 作用
hz 10 每秒定时任务次数,越大定期删除越频繁
active-expire-effort 10 控制删除强度,值越大扫描越积极
lazyfree-lazy-expire no Redis 4.0+,是否异步删除过期 key,避免大 key 阻塞主线程
maxmemory-samples 5 内存淘汰时的采样数(LRU 近似算法用)

💡 实战建议 : 给大量 key 设置过期时间时,加上随机偏移量(如 EX 3600 + rand(0,300)),避免同时过期触发 Fast 模式导致 CPU 飙升。


六、一句话总结

策略 本质
定时删除 用 CPU 换内存,太贵,不用
惰性删除 用内存换 CPU,太懒,单用会漏
定期删除 抽样巡逻,可控可调,是主力
Redis 组合拳 定期巡逻 + 惰性把关 + Fast 应急 = 性能与内存的最优解

Redis 的过期删除,不是某一种策略的胜利,而是两种策略互相补短的艺术。理解这一点,才算真正读懂了 Redis 的内存管理哲学。