(Redis)过期删除策略
1. 背景
Redis 支持为 Key 设置过期时间(TTL),让数据在一定时间后自动失效。
例如:
SET session:1001 "userA" EX 60 # 60 秒后过期
但是问题来了:Key 到期后,Redis 什么时候、如何删除它?
如果删除不及时,会造成内存浪费;如果删除太频繁,又会占用 CPU。
因此,Redis 设计了 三种过期删除策略。
2. 三种过期删除策略
(1)定时删除
原理:为每个设置过期时间的 Key 创建一个定时器,到期后立即删除。
✅ 优点:能及时释放内存,过期数据不会长期存在。
❌ 缺点:每个 Key 都要维护定时器,开销非常大;如果过期 Key 很多,会严重影响 Redis 性能。
结论:不适合 Redis 这种高性能场景。
(2)惰性删除
原理:当客户端访问某个 Key 时,Redis 才会检查它是否过期。
如果过期 → 删除,不返回数据;
如果没过期 → 正常返回。
✅ 优点:只在访问时才检查,几乎没有额外开销,对 CPU 友好。
❌ 缺点:如果某些 Key 过期后从未被访问,就会一直占用内存,导致空间浪费。
(3)定期删除
原理:Redis 会定期(默认每 100ms)随机抽取一批设置了过期时间的 Key,检查是否过期,如果过期就删除。
✅ 优点:相比定时删除更省 CPU,相比惰性删除又能回收一部分无访问的过期 Key。
❌ 缺点:抽样删除,可能存在一部分过期数据滞留内存一段时间。
3. Redis 实际采用的策略
Redis 没有单独使用其中一种,而是结合了 惰性删除 + 定期删除:
惰性删除:保证过期数据在访问时一定会被清理。
定期删除:保证即使没人访问,过期数据也能被逐步清理掉。
👉 这样做能 兼顾性能和内存,避免 CPU 或内存被某一方面拖垮。
4. 总结
策略 | 删除时机 | 优点 | 缺点 | 是否被 Redis 采用 |
---|---|---|---|---|
定时删除 | 过期时间一到立刻删除 | 内存释放及时 | CPU 开销大 | ❌ |
惰性删除 | 访问时检查是否过期 | 对 CPU 友好 | 内存可能浪费 | ✅ |
定期删除 | 每隔一段时间随机抽查 | 内存与性能平衡 | 删除不够精准 | ✅ |