Redis远程怎么批量删数据,过程和技巧聊一聊
- 问答
- 2026-01-24 08:03:00
- 2
直接在远程生产环境的Redis上执行FLUSHDB或FLUSHALL命令是极度危险的行为,这相当于把整个数据库或者整个Redis服务的数据瞬间清空,杀伤力太大,除非你真的确定需要清空所有数据,否则绝对不要用,我们通常说的“批量删数据”,指的是有选择性地删除符合特定规则的一批key。
怎么安全又高效地远程批量删除呢?过程和方法可以这么来聊。
第一步:连上远程Redis
这没啥好说的,你得先能连接到那台远程的服务器,一般用Redis的命令行客户端redis-cli,命令大概长这样:
redis-cli -h your_redis_host -p 6379 -a your_password
这里-h后面跟你的Redis服务器IP或域名,-p是端口(默认6379),-a是密码(如果设置了的话),如果没密码,就不用-a参数,为了安全,有时候不建议直接在命令里写密码,可以先不加-a,等连上去之后再用AUTH命令认证。
第二步:找出你想删的那些key
批量删除的前提是,你得知道要删谁,Redis提供了两个关键命令来查找key:KEYS和SCAN。

-
使用
KEYS模式匹配(小数据量/测试环境用) 这个命令最简单直接,你想删除所有以user:session:开头的会话key,可以这么查:KEYS user:session:*这个命令会列出所有匹配的key。这里有个非常重要的坑:KEYS命令在执行时会阻塞Redis服务器,直到它扫描完所有key,如果你的Redis里存了几百万甚至上亿个key,执行KEYS *可能会让Redis卡住好几秒甚至更久,导致其他所有请求都无法处理,可能引发服务雪崩。绝对不要在线上生产环境使用KEYS命令,尤其是在key很多的情况下,它只适合在测试环境或者你可以确定key数量非常少的时候,用来快速查看。 -
使用
SCAN迭代遍历(生产环境首选) 正因为KEYS的阻塞问题,Redis提供了SCAN命令,它是一个游标迭代器,每次只返回一小部分key,不会长时间阻塞服务器,你可以通过多次执行SCAN来逐步获取所有的key,虽然整个过程可能比KEYS慢一点,但它是安全的。 用法示例:SCAN 0 MATCH user:session:* COUNT 100这里的0表示从游标0开始第一次遍历,命令会返回两个值,一个是下一次迭代用的新游标(如果是0,表示迭代结束了),另一个是本次扫描到的key列表。COUNT参数是建议每次扫描的数量,只是一个参考值,Redis不一定会完全遵守。 你需要写一个循环,用上一次返回的游标作为下一次SCAN的参数,直到游标变回0为止,这个循环通常在脚本里实现,而不是手动在命令行一次次输入。
第三步:执行批量删除
找到了key的列表,接下来就是删除了,单个删除用DEL keyname,批量删除也是用DEL,但它可以同时接多个key,比如DEL key1 key2 key3,但问题在于,我们通过SCAN找出来的key可能成百上千,怎么把它们塞进一个DEL命令呢?这里就有技巧了。

-
借助Shell脚本(Linux/Mac环境) 这是最常用、最直接的方法,把
redis-cli和SCAN命令结合起来,通过Shell的管道和xargs工具来批量处理,一个经典的命令如下:redis-cli -h your_host -a your_password --scan --pattern "user:session:*" | xargs -L 1000 redis-cli -h your_host -a your_password DEL我们来拆解一下这个“组合拳”:redis-cli ... --scan --pattern "user:session:*":这里的--scan选项就是告诉redis-cli在背后使用非阻塞的SCAN命令来遍历key,而不是危险的KEYS命令,它会一行一个地输出所有匹配的key。- (管道符):将上一个命令的输出,作为下一个命令的输入。
xargs -L 1000:xargs命令的作用是将前面管道传过来的多行输入,转换成后面命令的参数。-L 1000表示每次最多取1000个key作为一组参数,为什么要分组?因为DEL命令能接受的参数数量是有限的,一次性删几十万个key可能会超出Redis的限制,所以分批删更安全。redis-cli ... DEL:这是最终执行删除的命令。xargs会把每一组1000个key附加在DEL后面,形成DEL key1 key2 ... key1000这样的命令来执行。
这个方法非常高效,也是运维人员最常用的技巧,你只需要在终端执行这一行命令,就可以安心地等着它跑完了。
-
使用Lua脚本(更复杂但更原子化) 如果上面的Shell方法因为网络或权限问题用不了,或者你希望删除操作是一个原子操作(要么全部成功,要么全部失败),可以考虑在Redis内部执行Lua脚本。 你可以用
EVAL命令直接执行一段Lua代码,但更常见的做法是,先把复杂的Lua脚本加载到Redis中,生成一个SHA1哈希值,然后用EVALSHA通过这个哈希值来调用脚本,这样更节省带宽。 编写Lua脚本需要一点额外的学习成本,而且如果删除的key数量巨大,Lua脚本执行时间过长,同样有阻塞Redis的风险(虽然比KEYS好点),对于超大批量的删除,还是优先推荐上面的Shell管道方法。
总结一下技巧和注意事项:
- 安全第一:永远优先使用
SCAN或其变体(如SSCAN对于集合)代替KEYS,避免生产事故。 - 分批删除:使用
xargs -L或者Lua脚本中的循环来控制每次删除的key数量,避免单次操作过大。 - 先验后删:在执行真正的删除命令前,可以先只用
--scan --pattern命令把匹配的key打印出来,确认一下是不是你要删的那些,确认无误后再加上| xargs ... DEL。 - 选择时机:批量删除操作最好在业务低峰期(比如深夜)进行,最大限度减少对正常服务的影响。
- 做好备份:在进行任何大规模数据操作之前,如果数据重要,务必确认有可用的备份方案。
就是关于Redis远程批量删除数据的一些实践过程和技巧,核心就是利用SCAN的非阻塞特性和Shell命令的管道组合,来实现安全、可控的批量操作。
本文由邝冷亦于2026-01-24发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/84967.html
