Redis Key 过期策略详解(过期时间、删除机制、内存淘汰机制)
一、前言
Redis 作为高性能内存数据库,常用于缓存、限流、分布式锁、临时数据存储等场景。绝大多数业务数据都不需要永久存储,因此 Redis 的 Key 过期与删除机制是后端开发必须掌握的技能
很多同学容易混淆两个概念:
-
过期删除策略:Key 到期了怎么被删除?
-
内存淘汰策略:内存满了删谁?
2. 过期数据存储原理
Redis 中所有带过期时间的 Key,都会单独维护一张 过期字典:
-
字典的 Key:Redis 的真实 key
-
字典的 Value:过期时间戳(精确到毫秒)
也就是说Redis 判断 key 是否过期,就是去过期字典对比当前时间戳。
3. 注意:过期时间是「绝对时间」
expire 设置的是绝对时间戳,如果修改服务器时间,会导致 key 提前过期或永久不过期。
三、Redis 三种过期删除策略
Redis 针对已经过期的 Key,采用 惰性删除 + 定期删除 组合策略,淘汰所有过期数据。
1. 惰性删除(被动删除)
规则:Key 过期不会立刻删,等用户下次访问时再判断是否过期。
流程:
客户端查询 key
Redis 先检查过期字典
如果已过期:直接删除 key,返回空
如果未过期:正常返回数据
优点:
1,极致节省 CPU 资源
2,不会浪费算力删冷门 key
缺点:大量冷门过期 key 永远没人访问,一直占用内存,造成内存泄漏
2. 定期删除(主动删除)
为了解决惰性删除的内存积压问题,Redis 开启定时轮询清理。
规则:
1,默认每 100ms 执行一次
2,随机抽取部分带过期的 key 检查
3,删除已过期的 key
4,不会扫描全量 key,防止 CPU 打满,阻塞对正常的业务请求的处理
优点:缓解过期 key 内存积压问题
缺点:随机采样,依然可能有大量过期 key 漏删
3. 结论:双策略组合
惰性删除 + 定期删除 = Redis 标准过期删除策略
但是即便如此,依然存在大量过期 key 堆积内存的风险 → 所以需要内存淘汰策略兜底。
四、Redis 内存淘汰策略(兜底策略)
当 Redis 达到 maxmemory 最大内存限制 时,会触发内存淘汰策略,主动删数据释放空间。
1. 七种淘汰策略
-
noeviction:默认策略,不删数据,直接报错
-
volatile-lru:只淘汰带过期的 key,优先删最少使用
-
allkeys-lru:淘汰所有 key,优先删最少使用(最常用)
-
volatile-lfu:过期 key 中删除使用频率最低
-
allkeys-lfu:所有 key 中删除使用频率最低
-
volatile-random:过期 key 随机删
-
allkeys-random:所有 key 随机删
2. 生产环境推荐配置
缓存业务首选:allkeys-lru
理由:热点数据常驻,冷门数据淘汰,缓存命中率最高。
五、面试高频总结
1. Redis 过期 key 如何删除?
采用惰性删除+定期删除双策略:
惰性删除:访问时判断过期,过期立即删除
定期删除:定时随机采样清理过期 key
内存满了再触发内存淘汰策略兜底。
2. 为什么不采用定时全量扫描删除?
全量扫描会极大占用 CPU,高并发场景会导致 Redis 卡顿、吞吐量暴跌。
3. 过期 key 会不会一直占用内存?
有可能。冷门过期 key 没人访问、且没被采样到,会一直占内存,直到内存满触发淘汰策略。
六、实际开发建议
1,所有缓存 Key 必须设置过期时间,避免内存溢出(可用内存变得越来越少)
2,过期时间尽量随机,防止缓存雪崩(大量的key在同一时间集体失效,请求直接绕过redis访问mysql数据库,数据库访问量暴增,直接压垮myaql,从而使数据库宕机)
3,热点数据可以设置长期有效,依靠 LRU 淘汰
4,禁止大量 Key 设置相同的过期时间
七、总结
1. Redis 没有实时删除策略,采用 惰性删除 + 定期删除 平衡 CPU 与内存;
2. 过期删除解决「到期数据清理」,内存淘汰解决「内存爆满兜底」;
3. 生产环境核心要点:Key 必过期、时间打散、合理配置 LRU 策略。
网硕互联帮助中心





评论前必须登录!
注册