一文详解Redis中的LRU算法

高手们有没有人讲详细点的我想教一下,一文详解Redis中的LRU算法
最新回答
清风未央

2026-10-19 15:54:14

Redis中的LRU算法详解如下:

1. LRU算法的核心作用
LRU(Least Recently Used)即最近最少使用算法,用于在内存达到上限时淘汰数据。其核心逻辑是优先淘汰长时间未被访问的key,从而释放内存空间。Redis通过LRU策略避免因内存不足导致的性能下降或系统错误(如触发swap机制)。

2. Redis的LRU实现方式
Redis并未采用严格的LRU算法,而是使用近似LRU以平衡性能与内存开销。具体实现分为两步:

  • 时间戳记录:每个key对象增加24位字段存储最近访问时间戳(如SET、GET等操作会更新时间戳)。
  • 随机采样淘汰:当内存达到maxmemory限制时,Redis会随机采样5个key(默认值,可通过maxmemory_samples配置),比较它们的访问时间戳,淘汰最旧的key。若内存仍不足,则重复此过程。
  • 淘汰池优化(Redis 3.0+):Redis 3.0引入淘汰池机制,将每次采样的key与池中待淘汰的key再次比较,确保最终淘汰的是全局最旧的key,提升准确性。

3. LRU相关淘汰策略
Redis提供多种基于LRU的淘汰策略,需通过maxmemory-policy配置:

  • allkeys-lru:从所有key中按LRU淘汰,适用于无持久化需求的场景。
  • volatile-lru:仅从设置了过期时间的key中按LRU淘汰,避免淘汰需持久化的数据。
  • 对比其他策略:

    noeviction:内存不足时拒绝写入(读操作仍允许)。

    allkeys-random/volatile-random:随机淘汰,无访问时间考量。

    volatile-ttl:按剩余生存时间(TTL)淘汰,TTL越小越优先。

4. 近似LRU的优缺点

  • 优点:

    减少额外内存开销(无需维护双向链表等数据结构)。

    通过采样降低计算复杂度,适合高QPS场景。

  • 缺点:

    准确性低于严格LRU,可能误淘汰高频访问的key(如示例中A被淘汰而B保留)。

    采样数(maxmemory_samples)越大,准确性越高但CPU消耗增加。Redis 3.0中该值设为10时,近似效果已接近严格LRU。

5. LRU的局限性及改进
LRU仅考虑访问时间,未兼顾访问频率,可能导致不合理淘汰(如短期高频访问但长期未访问的key被保留)。Redis 4.0引入LFU(Least Frequently Used)算法,通过记录key的访问次数和衰减周期,更精准地淘汰低频访问的key,弥补了LRU的不足。