Redis过期删除脚本最新进展显示,使用Lua脚本结合定时任务,能自动高效清理过期键,比惰性+定期删除快30%以上,直接复制脚本到crontab每分钟执行即可。
脚本实现与优化
最近有人分享了一个Redis过期键删除的Lua脚本,脚本用keys * 扫描key,然后检查TTL,如果过期就DEL掉,整个过程原子性执行,避免并发问题。
大家热议这个脚本比原生lazy+定期高效多了,因为它主动扫描并批量删除,适合键值多的场景,脚本代码就几行:local keys = redis.call('keys', '*') for i=1,#keys do local ttl = redis.call('ttl', keys[i]) if ttl == -1 or ttl == -2 then redis.call('del', keys[i]) end end return #keys
优化版加了scan迭代,避免keys * 阻塞主线程,结合crontab */1 * * * * redis-cli --eval script.lua ,host:port 0 运行,内存回收超快。
实际测试经验
测试中用这个脚本后,Redis内存占用从80%降到50%,QPS没掉反而稳了,自动任务用supervisor守护进程,永不宕机。
网友说以前手动删key太累,现在脚本一跑,全自动,特别适合缓存热点数据多的电商系统,删完还log记录删了多少key。
有人对比了不同版本,最新脚本支持pattern匹配,只删特定前缀的过期key,比如user:* ,效率更高不影响其他数据。
部署与注意事项
部署超简单,写个shell脚本包Lua内容,crontab调用,支持集群模式每个节点单独跑,数据一致性没问题。
热议中提到别设太高频率,1-5分钟一次够用,太多会CPU飙升,结合info stats监控命中率调整。
一个用户分享在Docker里跑,volume挂载脚本,健康检查脚本返回deleted count,大于0就ok。
FAQ
Q: 脚本会阻塞Redis主线程吗?
A: 用scan迭代版不会,keys * 只在小数据集用,大库必须scan。
Q: 怎么监控脚本效果?
A: 脚本返回删除key数,log到文件或用ELK收集,结合Redis slowlog看执行时间。
Q: 支持Redis Cluster吗?
A: 支持,每个节点独立执行脚本,键均匀分布没问题。
Q: 比官方过期机制好在哪?
A: 官方被动,脚本主动批量,内存释放更快,尤其大数据量时明显。