Redis缓存淘汰策略详解

Redis作为内存数据库,当内存不足时会触发缓存淘汰机制。理解并合理配置这些策略对系统性能至关重要。

内存不足时的表现

当Redis内存使用达到maxmemory配置阈值时,写入操作会返回错误,除非配置了淘汰策略。常见现象包括写入失败、性能下降或客户端收到OOM错误。

主要淘汰策略

Redis提供8种淘汰策略,通过maxmemory-policy配置项设置:

volatile-lru:从已设置过期时间的键中淘汰最近最少使用的键。

allkeys-lru:从所有键中淘汰最近最少使用的键,无论是否设置过期时间。

volatile-lfu:从已设置过期时间的键中淘汰使用频率最低的键(4.0+版本支持)。

allkeys-lfu:从所有键中淘汰使用频率最低的键(4.0+版本支持)。

volatile-random:从已设置过期时间的键中随机淘汰。

allkeys-random:从所有键中随机淘汰。

volatile-ttl:优先淘汰剩余存活时间最短的键。

noeviction:默认策略,直接拒绝写入操作并返回错误。

策略选择建议

对于包含热点数据的场景,allkeys-lru通常是最佳选择,能有效保留高频访问数据。

需要精确控制缓存生命周期的场景适合volatile-ttl,确保数据按时失效。

在数据访问模式不明显或均匀分布时,allkeys-random能提供公平的淘汰机制。

高版本Redis推荐尝试LFU策略,特别是访问模式随时间变化的场景。

配置优化技巧

合理设置maxmemory值,建议预留20%-30%内存缓冲。

对于LFU策略,可调整计数器衰减频率:

CONFIG SET lfu-decay-time 1
CONFIG SET lfu-log-factor 10

监控淘汰频率:

INFO stats | grep evicted
高级应用方案

结合业务特性实施分层缓存,高频数据放Redis,低频数据存数据库。

使用OBJECT命令分析键热度分布:

OBJECT freq keyname

对大型集合采用分片存储,降低单键淘汰影响。

淘汰过程监控

通过INFO命令关注关键指标:

  • evicted_keys:累计淘汰键数
  • used_memory:当前内存用量
  • mem_fragmentation_ratio:内存碎片率

设置报警阈值,当淘汰速率突增时需要及时扩容或优化。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐