Redis 内存淘汰策略有哪些?
参考回答
Redis 的内存淘汰策略用于在达到最大内存限制(maxmemory 配置)时,决定如何处理新写入请求。Redis 提供了以下几种内存淘汰策略:
- noeviction(默认策略):
不淘汰任何数据。当内存不足时,直接返回错误。 -
allkeys-lru:
在所有键中,优先淘汰最近最少使用的(Least Recently Used, LRU)键。 -
allkeys-lfu:
在所有键中,优先淘汰使用频率最低的(Least Frequently Used, LFU)键。 -
volatile-lru:
在设置了过期时间的键中,优先淘汰最近最少使用的键。 -
volatile-lfu:
在设置了过期时间的键中,优先淘汰使用频率最低的键。 -
volatile-ttl:
在设置了过期时间的键中,优先淘汰即将过期的键。 -
allkeys-random:
在所有键中,随机淘汰一个键。 -
volatile-random:
在设置了过期时间的键中,随机淘汰一个键。
详细讲解与拓展
1. 内存淘汰策略的配置
通过配置文件中的 maxmemory-policy 参数可以设置 Redis 的内存淘汰策略。例如:
maxmemory-policy allkeys-lru
在运行时也可以使用命令动态调整:
CONFIG SET maxmemory-policy allkeys-lru
2. 各策略的适用场景
- noeviction:
- 适合只读场景,不允许数据被淘汰的系统。
- 写入超出内存时会报错,因此适合严格控制内存的情况。
- allkeys-lru:
- 适合缓存场景,优先保留经常访问的热数据,淘汰冷数据。
- 是缓存系统中最常用的策略。
- allkeys-lfu:
- 更适合访问模式具有长期局部性的数据,例如访问频率随时间逐渐稳定的数据。
- 较
allkeys-lru更适合热点数据变化不频繁的场景。
- volatile-lru / volatile-lfu:
- 适合部分数据需要强制保留,而另一部分数据可以根据访问模式淘汰的场景。
- 数据需要设置过期时间才会被淘汰。
- volatile-ttl:
- 用于需要优先淘汰即将过期的数据的场景。
- 常见于需要尽量减少过期键存留时间的应用。
- allkeys-random / volatile-random:
- 随机淘汰键,适合对访问模式没有特殊要求的场景。
3. LRU 和 LFU 的工作原理
- LRU(Least Recently Used):
- Redis 使用近似算法实现的 LRU。
- 每个键会随机采样一定数量的键(默认 5 个,可以通过
maxmemory-samples调整),然后淘汰其中最少使用的。
- LFU(Least Frequently Used):
- Redis 为每个键维护一个使用频率计数器(16 位)。
- 每次访问一个键时,计数器根据时间衰减和访问频率递增调整,从而更精准地表示访问频率。
4. 淘汰过程的触发条件
- Redis 的内存分配超出
maxmemory限制时,会触发内存淘汰。 - 淘汰策略在满足以下条件时生效:
- 设置了
maxmemory参数。 - 当前内存占用达到或超过
maxmemory值。
- 设置了
总结
Redis 提供了多种内存淘汰策略以满足不同业务场景的需求。
– 缓存场景:推荐使用 allkeys-lru 或 allkeys-lfu,可以保留热点数据,淘汰冷数据。
– 部分数据必须保留:推荐使用 volatile-lru 或 volatile-ttl。
– 无特殊需求:可使用 allkeys-random 简单处理。
在实际应用中,需要根据业务特点选择合适的策略,并结合 maxmemory 和 maxmemory-samples 参数进行优化。