Skip to content

Redis过期Key删除策略

一、核心结论

Redis 中过期 key 不会被立刻物理删除,采用惰性删除 + 定期删除两种策略配合,共同管控过期数据。

二、惰性删除(被动删除)

原理

key 过期后仍保留在内存中,仅当客户端执行 get、hmget 等访问命令时,Redis 才会校验过期时间。若已过期,当场删除 key 并返回空;未过期则正常返回数据。

优点

CPU 开销极低,不会为闲置的过期键额外消耗扫描资源。

缺点

长期无人访问的过期 key 会一直驻留内存,持续占用空间,容易造成内存泄漏。

三、定期删除(主动扫描)

原理

Redis 按照固定频率随机抽取部分 key 进行批量校验与清理,分为 SLOW、FAST 两种执行模式:

  1. SLOW模式:定时任务,默认 hz=10,每秒执行10次,单次扫描最长耗时25ms,可在 redis.conf 中修改 hz 调整执行频率。
  2. FAST模式:由事件驱动触发,执行间隔不低于2ms,单次耗时不超过1ms,CPU占用更低。

该机制采用随机取样、而非全库遍历,在内存回收和CPU损耗之间做平衡。

优点

主动清理长期无人访问的过期 key,弥补惰性删除造成的内存浪费;同时限制单次执行时长,避免CPU使用率过高。

缺点

基于随机取样,仍存在小概率部分过期key长期未被扫描到,残留在内存中;相关参数调优有一定难度。

四、二者组合逻辑

  1. 惰性删除兜底:热点过期 key 被访问时,立即执行删除。
  2. 定期删除兜底:长期闲置的冷门过期 key,依靠定时巡检逐步清理。
  3. 额外兜底:内存达到阈值时,触发内存淘汰策略强制清理数据,该机制与过期删除相互独立。

五、面试高频问题解析

  1. 问:Redis 如何处理过期 key?

    答: Redis 不会立即删除过期 key,使用惰性删除加定期删除组合方案。惰性删除在访问 key 时校验并删除,CPU开销小,但易堆积冷数据;定期删除分两种模式定时随机抽样清理,释放内存。两者配合兼顾CPU与内存平衡,内存满时还会触发内存淘汰策略作为补充。

  2. 问:什么是惰性删除,有什么优缺点?

    答: 惰性删除是被动删除,只有当key被访问时才检查是否过期,过期则删除。优点是几乎不占用CPU;缺点是无人访问的过期key会一直占用内存,引发内存泄漏。

  3. 问:定期删除为什么是随机取样而不遍历全库?

    答: 全库遍历会产生巨大CPU开销,容易阻塞服务。随机取样可以控制单次执行耗时,平衡内存回收与服务性能。

  4. 问:过期删除和内存淘汰是什么关系?

    答: 二者是两套独立机制。过期删除负责清理已到期的key;内存淘汰是内存占满时触发,可清理所有key。过期key靠惰性+定期删除处理,内存溢出则由淘汰策略兜底。

Powered by VitePress 1.6.4 | 持续更新中