2026-08-29 00:05:02
Redis 的过期策略包括定期删除和惰性删除;内存淘汰机制包括noeviction、allkeys-lru、allkeys-random、volatile-lru、volatile-random、volatile-ttl六种。以下是详细介绍:
Redis 过期策略原理:Redis 默认每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。
设计考量:假设 Redis 里存放了大量设置了过期时间的 key,如果每隔几百毫秒就遍历所有设置过期时间的 key 进行检查,会导致 Redis 的 CPU 负载过高,性能大幅下降。因此采用随机抽取部分 key 检查的方式,避免性能灾难。
存在问题:这种策略可能会导致很多过期 key 到了过期时间却没有被及时删除掉。
原理:在获取某个 key 的时候,Redis 会检查这个 key 是否设置了过期时间以及是否已经过期,如果过期了就会删除该 key,不会返回任何内容。
作用:作为定期删除的补充,解决定期删除可能遗漏过期 key 的问题。
潜在问题:如果定期删除漏掉了很多过期 key,且用户也没有及时去查询这些 key,导致没有触发惰性删除,大量过期 key 就会堆积在内存里,最终可能导致 Redis 内存耗尽。
当内存不足以容纳新写入的数据时,Redis 会根据不同的策略进行数据淘汰,以释放内存空间,以下是常见的内存淘汰机制:
策略描述:当内存不足以容纳新写入的数据时,新写入的数据会报错。
使用场景:这种策略一般很少使用,因为当内存不足时直接拒绝新数据写入,可能会影响业务的正常运行。
策略描述:当内存不足以容纳新写入的数据时,在键空间中移除最近最少使用的 key。
使用场景:这是最常用的内存淘汰策略,适用于大多数缓存场景。它基于 LRU(Least Recently Used,最近最少使用)算法,优先淘汰那些最近很少被访问的数据,保留经常被访问的数据,从而提高缓存命中率。
策略描述:当内存不足以容纳新写入的数据时,在键空间中随机移除一个 key。
使用场景:这种策略不太常用,因为随机移除 key 可能会导致缓存击穿问题。例如,随机移除的 key 可能是当前正在被大量访问的热点数据,移除后会导致大量请求直接访问数据库,增加数据库的压力。
策略描述:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。
使用场景:这种策略一般不太合适,因为它只考虑设置了过期时间的 key,可能会忽略一些没有设置过期时间但长期未被访问的 key,导致这些 key 一直占用内存。
策略描述:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
使用场景:与 allkeys-random 类似,这种策略也存在随机性带来的问题,可能会导致缓存击穿,因此也不常用。
策略描述:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,优先移除更早过期时间的 key。
使用场景:这种策略适用于那些对数据时效性要求较高的场景,优先淘汰即将过期的数据,可以保证缓存中的数据尽可能保持新鲜。