Redis 内存淘汰策略有哪些?

参考回答

Redis 的内存淘汰策略用于在达到最大内存限制(maxmemory 配置)时,决定如何处理新写入请求。Redis 提供了以下几种内存淘汰策略:

  1. noeviction(默认策略):
    不淘汰任何数据。当内存不足时,直接返回错误。

  2. allkeys-lru
    在所有键中,优先淘汰最近最少使用的(Least Recently Used, LRU)键。

  3. allkeys-lfu
    在所有键中,优先淘汰使用频率最低的(Least Frequently Used, LFU)键。

  4. volatile-lru
    在设置了过期时间的键中,优先淘汰最近最少使用的键。

  5. volatile-lfu
    在设置了过期时间的键中,优先淘汰使用频率最低的键。

  6. volatile-ttl
    在设置了过期时间的键中,优先淘汰即将过期的键。

  7. allkeys-random
    在所有键中,随机淘汰一个键。

  8. volatile-random
    在设置了过期时间的键中,随机淘汰一个键。


详细讲解与拓展

1. 内存淘汰策略的配置

通过配置文件中的 maxmemory-policy 参数可以设置 Redis 的内存淘汰策略。例如:

maxmemory-policy allkeys-lru

在运行时也可以使用命令动态调整:

CONFIG SET maxmemory-policy allkeys-lru

2. 各策略的适用场景

  1. noeviction
    • 适合只读场景,不允许数据被淘汰的系统。
    • 写入超出内存时会报错,因此适合严格控制内存的情况。
  2. allkeys-lru
    • 适合缓存场景,优先保留经常访问的热数据,淘汰冷数据。
    • 是缓存系统中最常用的策略。
  3. allkeys-lfu
    • 更适合访问模式具有长期局部性的数据,例如访问频率随时间逐渐稳定的数据。
    • allkeys-lru 更适合热点数据变化不频繁的场景。
  4. volatile-lru / volatile-lfu
    • 适合部分数据需要强制保留,而另一部分数据可以根据访问模式淘汰的场景。
    • 数据需要设置过期时间才会被淘汰。
  5. volatile-ttl
    • 用于需要优先淘汰即将过期的数据的场景。
    • 常见于需要尽量减少过期键存留时间的应用。
  6. allkeys-random / volatile-random
    • 随机淘汰键,适合对访问模式没有特殊要求的场景。

3. LRU 和 LFU 的工作原理

  1. LRU(Least Recently Used)
    • Redis 使用近似算法实现的 LRU。
    • 每个键会随机采样一定数量的键(默认 5 个,可以通过 maxmemory-samples 调整),然后淘汰其中最少使用的。
  2. LFU(Least Frequently Used)
    • Redis 为每个键维护一个使用频率计数器(16 位)。
    • 每次访问一个键时,计数器根据时间衰减和访问频率递增调整,从而更精准地表示访问频率。

4. 淘汰过程的触发条件

  1. Redis 的内存分配超出 maxmemory 限制时,会触发内存淘汰。
  2. 淘汰策略在满足以下条件时生效:
    • 设置了 maxmemory 参数。
    • 当前内存占用达到或超过 maxmemory 值。

总结

Redis 提供了多种内存淘汰策略以满足不同业务场景的需求。
缓存场景:推荐使用 allkeys-lruallkeys-lfu,可以保留热点数据,淘汰冷数据。
部分数据必须保留:推荐使用 volatile-lruvolatile-ttl
无特殊需求:可使用 allkeys-random 简单处理。

在实际应用中,需要根据业务特点选择合适的策略,并结合 maxmemorymaxmemory-samples 参数进行优化。

发表评论

后才能评论