Redis过期策略和内存淘汰机制

高手,哪位知道,Redis过期策略和内存淘汰机制
最新回答
天空暗下来我就是光

2026-01-08 23:26:23

Redis主要通过内存淘汰机制和过期策略两种方式配合实现键值的清理,以避免内存耗尽导致服务不可用。以下是具体说明:

一、内存淘汰机制

当Redis节点内存使用达到最大值(由maxmemory配置项设定)时,会触发内存淘汰策略以腾出空间。Redis 4.0前有6种策略,4.0后新增2种,共8种:

  • noeviction不淘汰任何数据,内存不足时新增操作报错(默认策略)。适用于需保证数据不丢失的场景,但可能导致服务不可用。

  • allkeys-lru从所有键值中淘汰最近最少使用(LRU)的键。适用于访问模式具有明显时效性的场景,如热点数据缓存。

  • allkeys-random从所有键值中随机淘汰。适用于无明确访问模式或数据价值均等的场景。

  • volatile-lru从设置了过期时间的键值中淘汰LRU键。适用于需保留永久键但允许过期键被淘汰的场景。

  • volatile-random从设置了过期时间的键值中随机淘汰。适用于过期键价值均等的场景。

  • volatile-ttl优先淘汰设置了过期时间且剩余生存时间(TTL)最短的键。适用于需快速释放过期键内存的场景。

  • allkeys-lfu(Redis 4.0+)从所有键值中淘汰最不经常使用(LFU)的键(基于访问频率)。适用于访问频率差异显著的场景。

  • volatile-lfu(Redis 4.0+)从设置了过期时间的键值中淘汰LFU键。适用于需结合过期时间和访问频率的场景。

配置方式:在redis.conf中修改maxmemory-policy参数,例如:

maxmemory-policy allkeys-lru二、缓存过期策略

内存淘汰机制是被动清理,而过期策略定义键值何时失效,通过惰性删除和定期删除配合实现:

  • 惰性删除

    原理:客户端访问键时,Redis检查其是否过期。若过期则删除并返回null,否则返回键值。

    优点:不占用额外资源,仅在访问时检查。

    缺点:未被访问的过期键会长期占用内存,可能导致内存泄漏。

    适用场景:对实时性要求不高、过期键访问频率低的场景。

  • 定期删除

    原理:Redis每秒执行hz次(默认10次)随机扫描,检查并删除部分过期键。

    优点:主动清理过期键,避免内存浪费。

    缺点:随机扫描可能遗漏部分键,需惰性删除补充。

    配置方式:修改redis.conf中的hz参数(值越大扫描频率越高,但增加CPU负载):

    hz 10

两者配合逻辑:定期删除主动清理大部分过期键,惰性删除处理剩余未被扫描到的键,共同避免内存浪费。

三、关键区别
  • 触发条件:

    内存淘汰机制:内存达到maxmemory阈值时触发。

    过期策略:键值过期后,通过惰性或定期删除触发清理。

  • 作用范围:

    内存淘汰机制:针对所有键(或部分键,如仅过期键)。

    过期策略:仅针对设置了过期时间的键。

  • 目标:

    内存淘汰机制:防止内存耗尽,保证服务可用性。

    过期策略:及时释放过期数据,避免无效占用。

图:Redis内存管理机制示意图(来源:原文配图)四、应用建议
  1. 内存敏感场景:优先选择allkeys-lru或allkeys-lfu,结合hz调高定期删除频率。
  2. 数据一致性要求高:使用volatile-ttl或volatile-lru,避免永久键被淘汰。
  3. 避免内存耗尽:避免使用noeviction,除非能容忍写入错误。
  4. 监控与调优:通过INFO memory命令监控内存使用,动态调整maxmemory和淘汰策略。

通过合理配置内存淘汰策略和过期策略,可优化Redis内存利用率,平衡性能与可靠性。