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%超过则继续扫否则换库单次最大耗时25msslow 模式超时即停不阻塞主线程为什么是随机抽样而不是全量遍历假如 Redis 存了几千万个 key全量遍历一次要几分钟服务直接瘫痪。随机抽 20 个既能逐步清理又不影响正常请求。三、Redis 的真实组合拳惰性 定期 Fast 模式Redis 实际采用的是惰性删除 定期删除的组合策略且内置了双模式自适应调节特性Slow 模式默认Fast 模式触发型执行频率每秒 10 次最高每秒 1000 次每 1ms 一次单次最大执行时间25ms1ms触发条件定时触发上一次 slow 模式中过期 key 比例 25%适用场景正常业务大量 key 同时过期如秒杀结束CPU 占用低高组合逻辑定期删除负责主动巡逻清理大部分长期未访问的过期 key控制内存整体水位。惰性删除负责最后把关任何被访问的 key 必定是干净的绝不返回过期数据。两者配合既不让 CPU 空转也不让内存膨胀——这才是 Redis 高性能的精髓所在。四、三策略优劣总对比维度定时删除惰性删除定期删除Redis 实际方案内存效率⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐CPU 效率⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐实现复杂度高低中中内存泄漏风险无高低极低是否采用❌✅✅✅组合五、关键配置参数参数默认值作用hz10每秒定时任务次数越大定期删除越频繁active-expire-effort10控制删除强度值越大扫描越积极lazyfree-lazy-expirenoRedis 4.0是否异步删除过期 key避免大 key 阻塞主线程maxmemory-samples5内存淘汰时的采样数LRU 近似算法用实战建议 给大量 key 设置过期时间时加上随机偏移量如EX 3600 rand(0,300)避免同时过期触发 Fast 模式导致 CPU 飙升。六、一句话总结策略本质定时删除用 CPU 换内存太贵不用惰性删除用内存换 CPU太懒单用会漏定期删除抽样巡逻可控可调是主力Redis 组合拳定期巡逻 惰性把关 Fast 应急 性能与内存的最优解Redis 的过期删除不是某一种策略的胜利而是两种策略互相补短的艺术。理解这一点才算真正读懂了 Redis 的内存管理哲学。