Redis 过期策略

Redis 的过期策略由过期键判定和过期键清理两部分组成,共同保障内存高效利用和数据时效性。 一、过期键判定 Redis 通过字典(expires 字典)存储所有设置了过期时间的键及其过期时间戳。当访问一个键时,会先检查该键是否存在于过期字典中: 如果存在且当前时间已超过过期时间,则判定为过期键。 如果不存在或未到过期时间,则正常返回键值。 二、过期键清理策略 Redis 不会主动遍历所有过期键进行清理,而是采用以下三种机制来平衡性能与内存占用:

  1. 惰性删除(Lazy Deletion) 原理:当客户端访问某个键时,才会检查该键是否过期,若过期则立即删除。 优点:对 CPU 友好,仅在必要时执行删除操作,无额外性能开销。 缺点:若大量过期键长期未被访问,会持续占用内存,可能导致内存浪费。

  2. 定期删除(Periodic Deletion) 原理:Redis 会周期性(默认每 100ms)随机抽取一定数量的过期键进行检查,删除其中已过期的键。 优点:可以主动清理部分过期键,避免惰性删除导致的内存过度占用。 缺点:清理不彻底,仍可能存在部分过期键未被及时删除。

  3. 内存淘汰(Memory Eviction) 当 Redis 内存达到最大限制时,会触发内存淘汰策略,主动删除部分键以释放内存。这一机制会优先处理过期键,再处理未过期键。 常见的内存淘汰策略: volatile-ttl:删除过期时间最近的键。 volatile-random:随机删除已设置过期时间的键。 allkeys-lru:删除最近最少使用的键(无论是否过期)。 allkeys-random:随机删除任意键。 noeviction:默认策略,拒绝新写入操作,仅响应读请求。

三、过期策略的实际影响 数据一致性:过期键在被清理前仍可能被访问到,因此业务代码需自行验证数据有效性。 内存占用:定期删除和惰性删除的组合,在大多数场景下可维持合理的内存使用率;若内存压力较大,需配合合适的内存淘汰策略。 性能:定期删除的频率和抽样数量会影响性能,默认配置已适配大多数场景,无需频繁调整

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐