云计算百科
云计算领域专业知识百科平台

redis的key的过期策略

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 策略。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » redis的key的过期策略
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!