如何高效利用Redis的定期与惰性删除机制快速清除过期Key?
- 内容介绍
- 文章标签
- 相关推荐
本文共计848个文字,预计阅读时间需要4分钟。
由于立即删除在工程上不可行——并不是做不到,而是代价太高。如果每个key都配置一个定时器(例如调用setTimer),当有百万级key同时设置了EXPIRE,Redis主线程会被大量定时器回调压榨;修改过期时间还需要重置定时器,进一步加剧压力。延迟队列方案也类似:
GET 或 EXISTS 时触发的惰性删除怎么工作
这是最轻量的“补刀”动作:每次执行读命令前,Redis 会检查目标 key 是否在 db->expires 字典中登记了过期时间,且当前时间已超过该时间戳。一旦确认过期,就当场调用 dbDelete() 删除它,并返回 (nil)。
- 只影响本次访问的那一个
key,不扫描其他数据 - 从不主动触发,所以冷数据(比如长期不用的验证码)可能永远留在内存里
- 主从复制下,从节点不会自己惰性删除——它依赖主节点发来的
DEL命令同步删除
定期删除任务 activeExpireCycle() 怎么控制开销
这个函数藏在 serverCron() 里,默认每秒跑 10 次(由配置项 hz 控制)。
本文共计848个文字,预计阅读时间需要4分钟。
由于立即删除在工程上不可行——并不是做不到,而是代价太高。如果每个key都配置一个定时器(例如调用setTimer),当有百万级key同时设置了EXPIRE,Redis主线程会被大量定时器回调压榨;修改过期时间还需要重置定时器,进一步加剧压力。延迟队列方案也类似:
GET 或 EXISTS 时触发的惰性删除怎么工作
这是最轻量的“补刀”动作:每次执行读命令前,Redis 会检查目标 key 是否在 db->expires 字典中登记了过期时间,且当前时间已超过该时间戳。一旦确认过期,就当场调用 dbDelete() 删除它,并返回 (nil)。
- 只影响本次访问的那一个
key,不扫描其他数据 - 从不主动触发,所以冷数据(比如长期不用的验证码)可能永远留在内存里
- 主从复制下,从节点不会自己惰性删除——它依赖主节点发来的
DEL命令同步删除
定期删除任务 activeExpireCycle() 怎么控制开销
这个函数藏在 serverCron() 里,默认每秒跑 10 次(由配置项 hz 控制)。

