2026-04-24 05:18:59
Redis 内存淘汰机制详解
Redis 作为一款高性能的键值存储数据库,其内存管理机制至关重要。当 Redis 的内存使用达到上限时,就需要通过内存淘汰机制来释放空间,以便存储新的数据。以下是对 Redis 内存淘汰机制的详细解析。
一、配置 Redis 内存大小
Redis 的内存大小可以通过配置 maxmemory 参数来设置。根据“八二原理”,即 80% 的请求访问了 20% 的数据,一般建议将 Redis 内存大小设置为数据总量的 15% 到 30%,以兼顾访问性能和内存空间开销。
配置方式有两种:

二、Redis 内存淘汰策略
Redis 提供了多种内存淘汰策略,用于在内存不足时选择性地删除数据。这些策略可以分为两大类:不进行淘汰的策略和会进行淘汰的策略。
不进行淘汰的策略
noeviction:此策略不会对缓存的数据进行淘汰,当内存不够时就会报错。因此,如果真实数据集大小大于缓存容量,就不要使用此策略。
会进行淘汰的策略
allkeys-random:随机删除所有键中的数据。
allkeys-lru:使用 LRU(Least Recently Used)算法进行筛选删除,保留最近频繁使用的数据。
allkeys-lfu:使用 LFU(Least Frequently Used)算法进行筛选删除,保留访问次数最多的数据(Redis 4.0 引入)。
volatile-random:随机删除设置了过期时间的数据。
volatile-ttl:根据过期时间先后进行删除,越早过期的越先被删除。
volatile-lru:使用 LRU 算法筛选并删除设置了过期时间的数据。
volatile-lfu:使用 LFU 算法筛选并删除设置了过期时间的数据。
以 volatile 开头的策略只针对设置了过期时间的数据,即使缓存没有被写满,如果数据过期也会被删除。以 allkeys 开头的策略是针对所有数据的,如果数据被选中了,即使过期时间没到,也会被删除。当然,如果它的过期时间到了但未被策略选中,同样会被删除。
配置淘汰策略的方式也有两种:

三、LRU 算法
LRU(Least Recently Used)算法会将最不常用的数据筛选出来,保留最近频繁使用的数据。在 Redis 中,LRU 算法的实现进行了一些优化,以避免直接使用链表管理所有缓存数据带来的额外开销和性能降低。
Redis 对 LRU 的优化包括:

四、LFU 算法
LFU(Least Frequently Used)算法是基于数据访问次数来淘汰数据的,它在 LRU 策略基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。LFU 算法在 Redis 4.0 时被引入。
在 Redis 中,LFU 算法的实现方式如下:
使用 LFU 策略淘汰缓存时,会把访问次数最低的数据淘汰,如果访问次数相同,再根据访问的时间,将访问时间戳最小的淘汰。
Redis 引入 LFU 算法的原因在于,在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。而 LRU 算法是基于访问时间的,如果系统对大量数据进行单次查询,这些数据的 lru 值就很大,使用 LFU 算法就不容易被淘汰。
综上所述,Redis 的内存淘汰机制是一个复杂而灵活的系统,通过合理配置内存大小和选择适当的淘汰策略,可以有效地管理 Redis 的内存使用,提高系统的性能和稳定性。