Redis的LRU算法怎么实现和应用?过期LRU策略怎么解析?怎么高效选择缓存淘汰方案?

文章导读
Redis的LRU(Least Recently Used)算法通过近似算法实现,每当内存达到maxmemory限制时,随机采样若干键,根据键的空闲时间选择淘汰最久未使用的键。应用中设置maxmemory-policy allkeys-lru,在CONFIG SET中使用。过期LRU策略解析:allkeys-lru表示在所有键中淘汰最近最少使用的,无论是否设置过期时间。高效选择缓存淘汰方案:根据场
📋 目录
  1. Redis LRU 实现原理
  2. LRU算法的应用
  3. 过期LRU策略解析
  4. Redis LRU源码实现
  5. 高效选择缓存淘汰方案
  6. Redis内存淘汰策略对比
A A

Redis的LRU(Least Recently Used)算法通过近似算法实现,每当内存达到maxmemory限制时,随机采样若干键,根据键的空闲时间选择淘汰最久未使用的键。应用中设置maxmemory-policy allkeys-lru,在CONFIG SET中使用。过期LRU策略解析:allkeys-lru表示在所有键中淘汰最近最少使用的,无论是否设置过期时间。高效选择缓存淘汰方案:根据场景选noeviction(默认,不淘汰)、allkeys-lru(所有键LRU)、volatile-lru(带过期键LRU)、allkeys-random(随机)、volatile-random(过期随机)、volatile-ttl(过期时间最长)。

Redis LRU 实现原理

Redis并没有使用纯LRU算法,而是使用了一种近似的LRU算法。这种近似的LRU算法通过随机采样来选择淘汰的key,而不是维护一个精确的LRU链表。Redis的LRU实现是在redisDb结构中每个key维护一个lru字段,记录最后一次访问的时间戳(毫秒级)。当需要淘汰key时,Redis会随机采样几个key(采样数量由maxmemory-samples参数控制,默认是5),然后比较这些key的lru字段,选择lru值最小的key淘汰。采样算法比精确LRU更节省内存和时间开销,而且效果也非常接近精确LRU。

LRU算法的应用

在Redis中,LRU算法主要用于内存淘汰策略。当Redis内存达到maxmemory限制时,会根据配置的maxmemory-policy来决定淘汰哪些key。其中LRU相关的策略有:allkeys-lru(所有key中LRU)、volatile-lru(只在设置了过期时间的key中LRU)。查看当前策略:CONFIG GET maxmemory-policy。设置策略:CONFIG SET maxmemory-policy allkeys-lru。

Redis的LRU算法怎么实现和应用?过期LRU策略怎么解析?怎么高效选择缓存淘汰方案?

过期LRU策略解析

Redis的maxmemory-policy有以下几种:noeviction:不淘汰,返回错误;allkeys-lru:在所有key中LRU;volatile-lru:只在设置了expire的key中LRU;allkeys-random:所有key随机淘汰;volatile-random:设置了expire的key随机淘汰;volatile-ttl:设置了expire的key中剩余ttl最长的淘汰。过期LRU即volatile-lru策略,只对设置了过期时间的key进行LRU淘汰,如果没有设置过期时间的key则不淘汰,适合部分key需要长期缓存的场景。

Redis LRU源码实现

Redis中LRU是通过redisObject的lru字段实现的,lru字段记录key最后一次被访问的时间戳(server.lruclock)。淘汰时调用evictionPoolPopulate函数,从哈希表随机采样20个key(CONFIG_DEFAULT_MAXMEMORY_SAMPLES=20,注意不是5),然后调用evictionPoolFindWorstCandidate找到lru最老的key淘汰。代码中freeMemoryIfNeeded函数负责内存不足时的淘汰逻辑。

高效选择缓存淘汰方案

选择淘汰策略原则:1.如果所有数据重要性相近,用allkeys-lru;2.部分数据长期保留,用volatile-lru;3.对实时性要求高,用allkeys-random;4.内存紧张不希望拒绝写入,用allkeys-lru;5.希望优先淘汰快过期的,用volatile-ttl。实际测试不同策略的命中率,选择效果最好的。监控INFO stats中的evicted_keys和keyspace_hits来评估策略效果。

Redis的LRU算法怎么实现和应用?过期LRU策略怎么解析?怎么高效选择缓存淘汰方案?

Redis内存淘汰策略对比

LRU策略在采样数较大时(maxmemory-samples调大)效果接近精确LRU,CPU开销稍高但命中率更好。Random策略CPU最低但命中率差。volatile策略节省内存,只淘汰部分key。实际生产中allkeys-lru是最常用的,结合INFO命令监控evicted_keys指标及时调优。

FAQ
Q: Redis LRU和LFU区别?
A: LRU基于最近使用时间,LFU基于使用频率计数,LFU更适合访问频率差异大的场景。
Q: maxmemory-samples调多大合适?
A: 默认5,内存大可调到10-20,提高淘汰准确性。
Q: 怎么查看当前淘汰策略?
A: CONFIG GET maxmemory-policy。
Q: volatile-lru和allkeys-lru什么时候用?
A: volatile-lru用于区分长期和短期缓存,allkeys-lru用于所有key同等重要。