Redis 过期 key 删除策略

⭐ 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 一次)

每次清理步骤:

  1. 随机选取一些带过期时间的 key(不是全量)
  2. 检查是否过期,过期则删除
  3. 如果这一批中 超过 25% 是过期的
    👉 继续重复这一轮(直到占比低于 25% 或达到时间上限)
  4. 整个循环有时间上限:默认 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 会优先被淘汰掉。

一起串起来就闭环了。

posted @ 2025-12-05 16:19  中登程序猿  阅读(1)  评论(0)    收藏  举报