Redis里那些过期的key怎么快速找出来清理掉,省事又高效的方法分享
- 问答
- 2026-01-17 19:37:53
- 3
说到Redis里那些过期的key,咱们得先搞清楚一件事:Redis本身是有自动过期删除机制的,你给key设置个过期时间,比如setex mykey 60 "hello",60秒后这个key就没了,Redis会自动把它清理掉,这叫“被动过期”,还有一种情况是Redis会定期主动抽查一些key,如果过期了就删掉。(来源:Redis官方文档关于过期机制的描述)
问题就出在这里,自动删除它不总是那么及时,Redis为了保证性能,不会时时刻刻检查所有key,它有自己的小算盘,会平衡速度和内存使用,这就导致有时候,你以为过期的key已经没了,其实它还占着内存,成了一具“僵尸”,尤其是当你的Redis实例特别大,里面塞了成千上万个key,而且很多都设置了过期时间的时候,这些“僵尸key”积少成多,可能会白白吃掉你不少内存,等你想存新数据的时候才发现内存不够用了,那就尴尬了。(来源:基于Redis内存管理机制的普遍认知)
咱们不能完全指望Redis自己,得主动出击,找点省事又高效的办法来清理它们,下面我就分享几个实用的方法,你可以根据你的情况选着用。
第一个法子,也是最直接的法子:用SCAN命令慢慢扫。
Redis没有提供一个像keys *一样能直接列出所有过期key的命令(而且keys *在生产环境绝对不能用,它会阻塞整个服务,是灾难性的),我们可以用SCAN命令来代替。SCAN的好处是它不会阻塞Redis,它是分批次、游标式的扫描,每次只返回一小部分key,对服务影响很小。

具体怎么操作呢?你可以写一个简单的脚本(比如用Python、Shell都行),逻辑大概是这样的:
- 用
SCAN命令遍历数据库里所有的key。 - 对于每一个扫描到的key,用
TTL命令检查它的剩余生存时间。 - 如果
TTL返回的值是-2,注意了,这个-2就表示这个key已经过期了,但可能还没被Redis自动清理掉,或者TTL返回-1,这表示这个key压根没设置过期时间,是永久的,这种你就别动它。 - 一旦发现
TTL是-2的key,就直接用DEL命令把它删掉。
这个方法很灵活,你想什么时候扫就什么时候扫,比如在半夜业务低峰期跑一下脚本,缺点就是如果key特别多,扫描整个数据库会比较慢,算是个“慢工出细活”的招儿。(来源:Redis官方文档对SCAN和TTL命令的说明及社区常见实践)
第二个法子,更省心一点:利用Redis的redis-cli工具自带的神奇参数。
如果你不想自己写脚本,Redis自带的命令行工具redis-cli就藏着一个宝贝功能,你可以用下面这个命令:

redis-cli --scan --pattern '*' | while read key; do if [ "$(redis-cli ttl "$key")" -eq -2 ]; then echo "Deleting $key"; redis-cli del "$key"; fi; done
我来拆解一下这个命令是干啥的:
--scan --pattern '*':这和SCAN命令一个道理,安全地扫描所有key。| while read key:把扫描到的每一个key读出来。if [ "$(redis-cli ttl "$key")" -eq -2 ]:检查这个key的TTL是不是等于-2(也就是已过期)。then echo "Deleting $key"; redis-cli del "$key":如果是过期的,就先打印一下要删哪个key(这步可以不要),然后执行删除。fi; done:结束判断和循环。
你直接在服务器上执行这一长串命令就行了,特别适合临时救急或者偶尔手动清理一下,这其实就是把上面写脚本的逻辑用一行命令实现了,算是“懒人福音”。(来源:Redisredis-cli工具的使用手册及运维经验分享)
第三个法子,从根子上想办法:监控和优化过期策略。

与其总想着怎么清理,不如让问题少发生一点,这里有个进阶玩法是调整Redis的过期删除策略配置,Redis有个配置项叫hz,默认是10,这个值代表了Redis每秒后台任务(包括检查过期key)执行的频率,适当调高hz(比如调到20),可以让Redis更勤快地检查并删除过期key,减少“僵尸key”堆积的概率。
调高hz是有代价的,它会增加Redis的CPU使用率,所以你得权衡一下,是CPU资源更金贵,还是内存资源更紧张,这个操作最好在测试环境先试试,观察一下对性能的影响再决定。(来源:Redis配置文件redis.conf中关于hz参数的注释说明)
养成好习惯,在代码里设置过期时间的时候,尽量分散开,别让一大堆key在同一时刻过期,这可能会引起Redis瞬间的卡顿。
来个更强大的“武器”:用MEMORY命令来帮忙。
如果你用的Redis版本是4.0以上的,恭喜你,你多了一个超级好用的工具——MEMORY命令族,特别是MEMORY USAGE key可以查看一个key具体占了多少字节的内存,虽然它不能直接找出过期的key,但你可以结合SCAN,找出那些占用内存巨大且已经过期的key,优先清理它们,能达到“事半功倍”的效果,你先用SCAN扫,然后用TTL判断是否过期,如果过期了,再用MEMORY USAGE看看它多大,特别大的就重点标注或者立即删除。(来源:Redis 4.0版本新增MEMORY命令的官方文档)
快速找出并清理过期key,最实用的就是用SCAN加TTL命令组合,要么自己写脚本,要么用redis-cli的一行命令搞定,如果想更治本,可以微调Redis的hz配置,关键是要定期做这个事情,别等到内存报警了才手忙脚乱,希望这几个方法能帮你省点事,让Redis跑得更顺畅。
本文由酒紫萱于2026-01-17发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/82596.html
