⭐ Redis 的过期策略 = 惰性删除 + 定期删除(主动轮询)
面试官问你 “Redis 过期 key 怎么删除?”
标准答案只有一句:
Redis 使用惰性删除(lazy deletion)+ 定期删除(active expire cycle)。
不做定时删除,因为太消耗 CPU。
下面把这三者讲透,特别是定期删除的内部机制。
1️⃣ 惰性删除(Lazy Deletion)
🧠 思路:
只有当 key 被访问到时才检查是否过期。
流程:
用户访问 key → Redis 发现已过期 → 这时才删除它
🔥 优点
- 几乎没有额外开销
- 不影响 Redis 的吞吐
⚠ 缺点
- 如果 key 长期无人访问,它即使过期也不会被删除
- 内存可能被白白占着
2️⃣ 定期删除(Active Expire Cycle,主动清理)
这部分是面试的加分项,很多人只会“定期随机抽查”这句话。
我直接告诉你 Redis 的真实逻辑:
🔥 Redis 每秒 10 次主动清理(默认 100ms 一次)
每次清理步骤:
- 随机选取一些带过期时间的 key(不是全量)
- 检查是否过期,过期则删除
- 如果这一批中 超过 25% 是过期的
👉 继续重复这一轮(直到占比低于 25% 或达到时间上限) - 整个循环有时间上限:默认 CPU 10% 用于清理
这才是面试真正想听到的细节。
🧠 图解(逻辑图)
每隔 100ms 执行一次:[随机抽样 20 个 key]↓
[检查是否过期]↓
[超过 25% 是过期的] → [继续清理]↓
[未超过 or 达到时间限制] → 结束
✔ 为什么用“随机 + 控制 CPU 使用”?
如果 Redis 全量扫描:
❌ 会阻塞主线程(Redis 单线程)
❌ Redis QPS 会骤降
❌ 高峰期会直接宕掉
所以 Redis 的策略是:
低成本、分批、渐进式删除过期 key。
3️⃣(顺便提一下)为什么不用 “定时删除”?
定时删除意味着:
每个 key 到期 → 触发一个定时器 → 即时删除
缺点:
- 每个 key 都要维护 Timer → 成本巨大
- Redis 是单线程,定时器爆发会卡死服务器
- 不符合 Redis 的极致性能目标
👉 所以 Redis 根本没采用这个方案。
🔥 过期删除策略总结(你可以背)
Redis 的过期策略是 → 惰性删除 + 定期删除
惰性删除只在 key 访问时删除;
定期删除每 100ms 随机抽样一批带过期时间的 key 清理。
Redis 不采用定时删除,因为开销太大。
🧠 再补一个面试常见追问
❓ “如果 Redis 既不访问,也不跑到它的扫描区,那些过期 key 不是永远删除不了吗?”
答:
只有非常极端,Redis 才会有残留过期 key。
Redis 还会在内存不足时触发淘汰策略(LRU/LFU),这些过期 key 会优先被淘汰掉。
一起串起来就闭环了。