Redis的缓存淘汰策略

总结

Redis提供多种缓存淘汰策略,包括:volatile-lru(针对过期键的LRU淘汰)、allkeys-lru(全体键LRU)、volatile-lfu(过期键LFU)、allkeys-lfu(全体键LFU)、volatile-ttl(优先淘汰剩余时间短的键)、volatile-random/ allkeys-random(随机淘汰),以及默认的noeviction(禁止写入)。策略根据内存上限自动触发,用于管理内存不足时的数据清理。

详细解析

Redis 的 缓存淘汰策略(Eviction Policy)用于在内存不足时(达到maxmemory限制)选择哪些键(key)被删除以释放空间。其策略通过maxmemory-policy配置,以下是 Redis 支持的淘汰策略及其核心逻辑:


1. 淘汰策略分类

Redis 淘汰策略分为 键范围 和 淘汰算法 两个维度:

键范围
  • allkeys-*:所有键都可能被淘汰(包括未设置过期时间的键)。
  • volatile-*:仅淘汰设置了过期时间(TTL)的键。
淘汰算法
  • LRU(Least Recently Used):淘汰最久未使用的键。
  • LFU(Least Frequently Used):淘汰访问频率最低的键(Redis 4.0+)。
  • TTL:淘汰剩余过期时间最短的键。
  • Random:随机淘汰。

2. 具体策略详解

策略名称规则适用场景
noeviction不淘汰任何键,内存满时新写入操作返回错误(默认策略)。数据不可丢失,需严格内存控制。
allkeys-lru从所有键中选择最久未使用的键淘汰。通用缓存场景(推荐)。
volatile-lru从设置了 TTL 的键中选择最久未使用的键淘汰。部分数据允许过期。
allkeys-lfu从所有键中选择访问频率最低的键淘汰(Redis 4.0+)。热点数据缓存,区分冷热数据。
volatile-lfu从设置了 TTL 的键中选择访问频率最低的键淘汰(Redis 4.0+)。需要结合 TTL 管理冷数据。
allkeys-random从所有键中随机淘汰。无明确访问模式,简单快速。
volatile-random从设置了 TTL 的键中随机淘汰。随机淘汰过期数据。
volatile-ttl从设置了 TTL 的键中淘汰剩余存活时间最短的键。优先清理即将过期的数据。

3. 策略选择建议

缓存场景(允许数据丢失)
  • 优先选择allkeys-lru或allkeys-lfu:利用访问模式淘汰冷数据。
  • 若数据访问频率差异大:使用allkeys-lfu更精准(如热点文章、商品)。
持久化数据(不允许丢失)
  • 使用noeviction:避免误删数据,但需监控内存,防止写操作失败。
混合场景(部分数据可过期)
  • volatile-lru+ 设置 TTL:结合过期时间管理临时数据(如用户会话)。
特殊需求
  • 快速淘汰:allkeys-random或volatile-random(性能高但不够精准)。
  • 清理即将过期的键:volatile-ttl(如促销活动临时数据)。

4. LRU 与 LFU 的实现优化

Redis 未使用标准 LRU/LFU 算法,而是通过近似算法降低内存和计算开销:

  • LRU 近似:记录键的最近访问时间戳(精度为秒),淘汰时采样少量键(默认5个),选择最旧的。
  • LFU 近似:使用计数器(范围 0~255),按概率衰减计数器值,优先淘汰计数器低的键。
LFU 计数器衰减配置
  • 通过lfu-decay-time设置计数器衰减周期(默认1分钟),控制访问频率的时效性。

5. 配置示例

1

2

3

4

# redis.conf 配置文件

maxmemory 2gb                     # 设置最大内存

maxmemory-policy allkeys-lru      # 使用 LRU 淘汰所有键

maxmemory-samples 10              # 提高 LRU/LFU 采样精度(默认5)


6. 淘汰策略工作原理

  1. 触发条件:执行写入命令(如SET)时,若内存超过maxmemory,触发淘汰。
  2. 执行过程
    • 根据策略选择候选键。
    • 删除键并释放内存。
    • 若释放后仍不足,重复淘汰直到满足内存要求。

总结

策略核心逻辑适用场景注意点
allkeys-lru淘汰最久未使用的键通用缓存对访问模式敏感
allkeys-lfu淘汰访问频率最低的键热点数据场景需 Redis 4.0+
volatile-ttl淘汰最快过期的键临时数据管理依赖合理设置 TTL
noeviction禁止淘汰,直接报错数据不可丢失场景需严格监控内存

根据业务场景选择合适策略,并结合监控工具(如INFO memory)观察淘汰效果,必要时调整策略或优化数据访问模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值