Redis远程批量删数据,清理起来其实没那么麻烦还挺快的
- 问答
- 2026-01-05 19:55:27
- 2
根据多位运维开发者在知乎、CSDN博客及Stack Overflow等技术社区分享的实践经验综合整理)
Redis这个内存数据库用起来是快,但有时候清理起数据来,特别是那种要远程操作、还要批量删除符合特定规则的一大批数据的时候,很多刚接触的人会觉得有点无从下手,可能会想,是不是得连上去一个个手动找出来再删?那要是几万几十万个key,得弄到什么时候去,其实啊,这事儿真没想象中那么麻烦,用对了方法,可以说是相当快的,我这就把大家常用的几种简单直接的方法跟你说说。
最直接想到的方法,可能就是使用Redis自带的keys命令了,这个命令大家都用过,比如你想找所有以"user_session:"开头的key,就在Redis的命令行里输入keys user_session:*,它一下子就能把所有匹配的key给你列出来,看到结果了,有的人可能就想着,那我能不能直接把这条命令和删除命令连起来用?比如像这样keys user_session:* | xargs redis-cli del,这个思路是对的,就是先找出所有的key,然后通过管道传给del命令进行删除,这里有个很重要的但是,在生产环境上,强烈不建议直接使用keys命令来做批量删除的操作,这是很多有经验的开发者反复强调的一点,为什么呢?因为keys命令是阻塞式的,它会一次性遍历整个数据库的所有key,如果你的Redis数据库里存了几百万甚至上千万个key,这个命令一执行,Redis服务器在此期间就没法处理其他的读写请求了,相当于服务短暂卡死了,这可能会引起线上服务故障。keys命令可以偶尔在测试环境或者数据量极小的情况下用来查看一下key,但绝不能用于生产环境的批量删除。
那不用keys,用什么才能安全又快速地批量删除呢?答案就是scan命令,这个命令可以说是keys的完美替代品,它就是专门为了解决keys命令的阻塞问题而设计的。scan命令的工作方式不是一次性的全盘扫描,而是采用了一种叫迭代器的方式,每次只扫描一小部分key,然后返回一部分结果和一个游标(cursor),你拿到这个游标后,可以接着上次的位置继续扫描,这样就把一次性的巨大压力,分摊成了很多次微小的、非阻塞的操作,即使是在数据量巨大的生产环境,一边扫描一边删除,对Redis服务本身的影响也微乎其微,几乎感觉不到卡顿。
具体怎么用scan命令来批量删除呢?通常有两种常见的做法,一种是在Linux或者Mac的终端命令行里,结合redis-cli工具来操作,你还是想删除所有以"cache:temp:"开头的key,可以敲入这样一条命令:redis-cli -h your_redis_host -p 6379 -a your_password --scan --pattern "cache:temp:*" | xargs redis-cli -h your_redis_host -p 6379 -a your_password del,这条命令稍微长一点,我们来拆解一下:redis-cli -h ... --scan --pattern "cache:temp:*"这一部分,就是使用非阻塞的scan模式来搜索所有匹配的key,然后把结果输出,后面的| xargs redis-cli -h ... del意思是,把前面搜索到的每一个key,都作为参数传递给后面的del删除命令,这样,删除操作就安全地完成了,这种方法非常灵活,适合临时性的清理任务。
另一种方法,如果你是需要频繁执行某种模式的清理,比如定期清理一些临时数据,那么写一个简单的脚本会更方便,可以用Shell脚本,也可以用Python、PHP等任何你熟悉的、能操作Redis的语言,脚本的核心逻辑就是利用scan命令(在各种语言的Redis客户端里都有对应的scan方法)迭代地获取key,然后分批删除,用脚本的好处是你可以控制得更精细,比如每次删除1000个key,然后稍微停顿0.1秒再继续,这样对服务器更加友好,很多团队的运维脚本里都有类似的自动化清理任务。
除了上面这两种通用的方法,如果你的Redis版本是4.0及以上,那还有一个“大杀器”——unlink命令,它和del命令的区别在于,del是同步删除,会立刻释放内存;而unlink是异步删除,它只是把key从keyspace里移除,真正的内存回收会在后台线程里慢慢进行,当你需要一次性删除海量key的时候,用unlink代替del,可以避免删除操作本身造成Redis服务器的瞬间延迟升高,用法和del完全一样,就是把上面命令里的del换成unlink就行了,redis-cli ... --scan --pattern "cache:temp:*" | xargs redis-cli ... unlink,这在删除超大量数据时,能让服务更平稳。
所以你看,从最开始危险的keys加del,到安全的scan加del,再到更高效的scan加unlink,方法一直在进化,也越来越好用,远程批量删除Redis数据这个事情,核心就是避开keys这个坑,然后根据你的数据量和Redis版本,选择scan配合del或unlink,操作起来就是一行命令或者一个简单脚本的事,真的没那么麻烦,而且执行起来嗖嗖的快,对服务的影响也小,下次再遇到需要清理大量Redis数据的场景,可别再发愁了。

本文由酒紫萱于2026-01-05发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/75137.html
