Redis集群里要怎么快速拿到所有键值,别再一个个查了,教你轻松搞定
- 问答
- 2026-01-19 22:19:28
- 1
综合自Redis官方文档、多个技术社区如Stack Overflow、CSDN博客以及开发者实践经验分享)
想在Redis集群里一口气拿到所有键值,别再一个个查了,这事儿其实说简单也简单,说麻烦也麻烦,关键你得先明白Redis集群是咋回事,Redis集群跟单机的Redis不一样,它不是把所有的数据都放在一个篮子里,而是把数据分成了好多份,每一份叫做一个“分片”,这些分片分布在不同的节点上,你没办法像在单机Redis里那样,直接用个KEYS *命令就把所有钥匙都找出来,因为KEYS命令只在当前这个节点上起作用,它看不到其他节点上的钥匙。
那怎么办呢?别急,有办法,核心思路就一个:既然集群是分开的,那我们就逐个击破,问遍每一个节点,把它们手上的钥匙清单都拿过来,最后再汇总一下,听着好像还是得一个个查,但这里说的是“问节点”,而不是“问每一把钥匙”,速度可是天差地别。
用SCAN命令脚本(最常用、最推荐)
KEYS命令在生产环境基本是禁用的,因为它会阻塞Redis服务器,万一你钥匙特别多,整个服务可能就卡住了,聪明人都用SCAN。SCAN命令是渐进式的,它不会一下子把所有结果都给你,而是一小批一小批地返回,这样就不会卡住服务器。
在集群环境下,你需要写个小脚本(比如用Python的redis-py-cluster库,或者Shell脚本配合redis-cli工具),做下面几件事:
- 先找到所有主节点:连接到集群任意一个节点,它都能告诉你其他节点在哪里。
- 挨个节点执行
SCAN:对每一个主节点,都用SCAN命令去遍历它上面所有的键,你可以用SCAN 0开始,然后根据返回的下一个游标继续扫,直到游标变回0,说明这个节点扫完了。 - 把结果收集起来:每个节点返回的键列表,你都把它们存到一起,最后就是你想要的所有键了。
举个例子,如果你会用redis-cli命令行工具,可以结合--cluster call参数(来源:Redis官方文档关于redis-cli工具的说明),这个参数很强大,它能让你一个命令就在集群所有主节点上执行相同的操作,比如你可以这样写:
redis-cli -c -h <你的集群IP> -p <你的集群端口> --cluster call <任意一个主节点IP:端口> SCAN 0
不过要注意,这个命令返回的是每个节点SCAN的原始输出,包含游标和键列表,你需要自己处理一下才能得到干净的键名列表,如果键非常多,你可能需要写循环来处理多次SCAN。

对于会写点代码的朋友,用Python脚本是更灵活的选择,你用redis-py-cluster库,代码大概长这样:
from rediscluster import RedisCluster
# 配置集群节点地址,至少写一个,它能自动发现其他节点
startup_nodes = [{"host": "127.0.0.1", "port": "7000"}]
rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
# 用来存所有的键
all_keys = []
# 获取集群所有主节点
master_nodes = rc.cluster_nodes("master")
for node in master_nodes:
# 获取到每个节点的连接
node_conn = rc.get_redis_connection(node)
cursor = 0
while True:
# 在该节点上执行SCAN
cursor, keys = node_conn.scan(cursor=cursor, count=100) # count是每批数量,可调整
all_keys.extend(keys)
if cursor == 0: # 遍历完成
break
# all_keys 就是集群所有的键了
print(f"总键数: {len(all_keys)}")
# 如果你还需要值,可以再用 pipeline 批量获取,提高效率
这种方法最灵活,也最可控,你可以控制每次SCAN的数量,对服务器压力小,是生产环境下的标准做法。
非正规方法——如果情况紧急且能接受风险
有时候你可能只是在自己测试环境或者数据量不大的临时环境里,想快点儿看个大概,有个“取巧”但不建议在生产环境用的法子(来源:一些开发者的临时解决方案分享)。

因为Redis集群的每个分片本质上还是一个Redis实例,你可以暂时修改集群配置,把它“变成”一个普通的、不分片的Redis实例(比如用redis-cli --cluster add-node添加节点的方式临时调整,或者直接修改节点配置文件,使其以单机模式启动,但这会破坏集群,操作非常危险,仅用于极端测试),变成单机后,你就可以直接用KEYS *或者单机版的SCAN了。但必须严重警告:这个方法会彻底破坏你的集群架构和数据分布,用完必须恢复,否则后果自负。 除非你非常清楚自己在做什么,否则绝对不要在生产环境尝试。
使用第三方工具
市面上也有一些第三方工具或者图形化管理客户端(比如RedisInsight、Another Redis Desktop Manager等),它们通常都内置了“查看集群所有键”的功能(来源:这些工具的官方功能介绍或社区评测),你只要连上集群,点一下相应的按钮,工具底层其实也是用了上面方法一的原理,帮你完成了遍历所有节点的操作,然后用一个友好的界面展示给你,这对于不习惯命令行的同学来说,是个不错的选择,既方便又相对安全。
重要提醒
不管你用哪种方法,都要记住:
- 生产环境慎用
KEYS:再强调一遍,它是个危险命令。 - 性能考虑:即使是用
SCAN遍历整个集群,如果键的数量极其庞大(比如上亿),这个过程也会耗费不少时间和网络资源,可能会对集群性能产生一定影响,最好在业务低峰期进行。 - 你到底需要什么:很多时候,我们其实并不需要真的把所有的“键值对”都拿出来,可能只是需要键名列表,或者统计一下数量,如果只是要键名,用上面的方法拿到键列表就够了,如果还要值,那在拿到键列表后,最好使用
pipeline(管道)技术批量获取值,这比一个个用GET命令要快成百上千倍。
在Redis集群里快速拿到所有键值,没有那种“一键搞定”的魔法命令,最靠谱、最常用的方法就是写个脚本,利用SCAN命令遍历集群中的每一个主节点,然后把结果汇总起来,虽然听起来步骤多了点,但一旦脚本写好,就是一劳永逸的事儿,下次直接运行就行,这才是真正的“轻松搞定”。
本文由颜泰平于2026-01-19发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/83917.html
