Redis 提供了多种删除过期键的策略(Expiry Policies),用于在键过期后如何将其从内存中移除。这些策略主要影响 Redis 如何管理内存和性能之间的平衡。Redis 主要采用以下两种核心策略来删除过期的键:
一、主动删除(定期删除)
策略说明:
Redis 会周期性地随机抽取一部分设置了过期时间的键,检查它们是否已过期,如果过期则删除。
特点:
- 主动:由 Redis 的定时任务触发,不是等待用户访问。
- 随机抽查:不是检查所有过期键,而是每次从过期字典中随机抽取必定数量(默认约 20 个)的键进行检查。
- 周期性执行:由一个定时器每隔一段时间执行一次(源码中控制频率,如每秒执行 10 次,每次随机选一些 key 检查)。
优点:
- 能主动清理过期键,避免大量无用数据长期占用内存。
缺点:
- 由于是随机抽查,有可能某些过期键不会被及时发现和删除,导致它们会暂时滞留在内存中(成为“过期但未删除”的键)。
二、被动删除(惰性删除)
策略说明:
当客户端尝试访问某个键时,Redis 会先检查该键是否存在且是否已过期,如果已过期,则删除该键并返回 nil。
特点:
- 被动触发:只有当该键被访问时才检查是否过期。
- 按需删除:不访问的过期键不会被删除,依然占用内存。
优点:
- 对性能影响小:不需要额外的 CPU 周期去主动检测过期键。
- 实现简单高效。
缺点:
- 如果有大量过期键一直不被访问,就会一直占用内存,造成内存泄漏风险(虽然不是严格意义上的泄漏,但的确 浪费内存)。
三、内存淘汰机制(辅助策略,非直接删除过期键,但相关)
虽然不属于直接的“过期键删除策略”,但当 Redis 内存达到上限(通过 maxmemory配置)时,Redis 会根据配置的内存淘汰策略(eviction policies)去主动删除一些键(包括未过期的键),以释放空间。
常见的内存淘汰策略包括:
- noeviction(默认):不淘汰,写入报错
- allkeys-lru:从所有键中淘汰最近最少使用的键
- volatile-lru:从设置了过期时间的键中淘汰最近最少使用的键
- allkeys-random:从所有键中随机淘汰
- volatile-random:从设置了过期时间的键中随机淘汰
- allkeys-ttl:从所有键中优先淘汰剩余生存时间 TTL 最短的键
- volatile-ttl:从设置了过期时间的键中优先淘汰剩余生存时间 TTL 最短的键
注意:这些策略是在内存不足时使用的,与“键过期”本身不同,但有助于整体内存管理。
总结:Redis 删除过期键的两种主要策略
|
策略类型 |
触发方式 |
检查时机 |
优点 |
缺点 |
|
惰性删除 |
访问时触发 |
访问某个键时检查是否过期 |
对 CPU 友善,性能开销小 |
过期但未被访问的键会长期存在,可能浪费内存 |
|
定期删除 |
周期性触发 |
定时随机抽查部分过期键 |
能主动清理一部分过期键 |
不保证所有过期键都被及时删除,可能残留 |
Redis 实际采用的是:惰性删除 + 定期删除 两种策略的组合使用,以达到在性能和内存利用率之间取得平衡的效果。
补充提议:
- 如果你的业务中有大量设置了过期时间的键,并且你很关心内存使用效率,可以:
- 适当观察 Redis 的内存使用情况;
- 结合 INFO memory和 INFO stats查看 expired_keys(已删除的过期键数)等指标;
- 必要时通过设置合理的 maxmemory和 内存淘汰策略,防止内存耗尽。
如你想深入了解实则现原理,可以查看 Redis 源码中的 expire.c相关部分,列如 activeExpireCycle()函数就是负责定期删除的核心逻辑。
✅ 结论:Redis 删除过期键的策略主要有两种 —— 惰性删除(被动)和定期删除(主动),默认情况下两者结合使用,以兼顾性能和内存管理。

© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END






![[52破解首发] Cheat Engine 7.5.1 源码级汉化编译版 - 宋马](https://pic.songma.com/blogimg/20250419/c56beb77125844ac83281f7cc6b2e673.png)











- 最新
- 最热
只看作者