2026-10-22 13:30:44
Redis 的过期策略和内存淘汰机制是其内存管理的重要组成部分,它们共同确保了 Redis 在有限的内存资源下能够高效地运行。
一、过期策略Redis 提供了过期策略来管理设置了过期时间的 key。这些策略主要包括定时删除、定期删除和惰性删除,但 Redis 实际采用的是定期删除与惰性删除相结合的方式。
定时删除
原理:使用一个定时器来监视 key,当 key 过期时自动删除。
优点:内存及时释放。
缺点:消耗大量 CPU 资源,特别是在大并发请求下,CPU 需要将时间应用在处理请求上,而不是删除 key。因此,Redis 没有采用这一策略。
定期删除
原理:Redis 默认每 100ms 检查一次是否有过期的 key,并随机抽取一部分 key 进行检查(而不是检查所有 key)。如果发现有过期的 key,则进行删除。
优点:减少了 CPU 资源的消耗,同时能够在一定程度上保证内存的及时释放。
缺点:由于只是随机抽取 key 进行检查,因此可能存在部分过期的 key 没有被及时删除的情况。
惰性删除
原理:当客户端请求访问某个 key 时,Redis 会检查该 key 是否设置了过期时间以及是否已过期。如果已过期,则在返回给客户端之前删除该 key。
优点:进一步减少了 CPU 资源的消耗,只有在客户端请求访问时才进行检查和删除。
缺点:如果某个过期的 key 没有被及时访问,那么它就不会被删除,从而可能导致内存占用逐渐增加。
Redis 通过结合定期删除和惰性删除的方式,既减少了 CPU 资源的消耗,又能够在一定程度上保证内存的及时释放。然而,这种策略并不能完全避免内存占用逐渐增加的情况。因此,Redis 还提供了内存淘汰机制来进一步管理内存。
二、内存淘汰机制当 Redis 的内存使用达到上限时,内存淘汰机制会根据预设的策略来删除一些 key,以释放内存空间。Redis 提供了多种内存淘汰策略,包括:
volatile-lru
原理:从设置了过期时间的 key 中使用 LRU(最近最少使用)算法进行淘汰。
适用场景:当希望优先保留最近使用的、且设置了过期时间的 key 时。
allkeys-lru
原理:从所有 key 中使用 LRU 算法进行淘汰。
适用场景:当希望优先保留最近使用的 key,而不考虑是否设置了过期时间时。
volatile-lfu(Redis 4.0 版本新增)
原理:在过期的 key 中,使用 LFU(Least Frequently Used,最不经常使用)算法进行淘汰。LFU 算法根据 key 的访问频率来决定淘汰哪个 key,访问频率越低的 key 越容易被淘汰。
适用场景:当希望优先保留访问频率较高的、且设置了过期时间的 key 时。
allkeys-lfu(Redis 4.0 版本新增)
原理:从所有 key 中使用 LFU 算法进行淘汰。
适用场景:当希望优先保留访问频率较高的 key,而不考虑是否设置了过期时间时。
volatile-random
原理:从设置了过期时间的 key 中随机淘汰数据。
适用场景:当希望随机淘汰设置了过期时间的 key 时。
allkeys-random
原理:从所有 key 中随机淘汰数据。
适用场景:当希望随机淘汰任意 key 时。
volatile-ttl
原理:在设置了过期时间的 key 中,根据过期时间进行淘汰,越早过期的优先被淘汰。
适用场景:当希望优先淘汰即将过期的 key 时。
noeviction(默认策略)
原理:当内存不足以容纳新写入数据时,新写入操作会报错。
适用场景:当不希望 Redis 自动删除 key 来释放内存时,可以选择此策略。但需要注意的是,这可能会导致 Redis 无法继续写入新的数据。
通过选择合适的内存淘汰策略,Redis 能够在内存使用达到上限时,根据预设的规则来删除一些 key,从而确保 Redis 的稳定运行。同时,用户也可以根据自己的实际需求来配置和调整这些策略。