redis删除过期键策略有哪些

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 删除过期键的策略主要有两种 —— 惰性删除(被动)和定期删除(主动),默认情况下两者结合使用,以兼顾性能和内存管理。

redis删除过期键策略有哪些

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共1条

请登录后发表评论

    暂无评论内容