Redis里怎么快速拿到所有key,别只会keys命令试试这些方法
- 问答
- 2026-01-04 04:18:55
- 17
很多人一说到在Redis里获取所有的key,第一个想到的命令就是KEYS *,这确实能拿到,但如果你真的在线上生产环境用了这个命令,很可能会把运维同事或者DBA招来,问你为什么服务突然卡顿了,这是因为KEYS命令有一个致命缺点:它会一次性遍历整个数据库的所有key,当key的数量非常庞大时(比如百万、千万级别),这个操作会阻塞Redis服务器,导致在此期间其他所有请求都被卡住,就像高速公路收费站只有一个窗口,却来了一辆需要清点上千件货物的大卡车,后面的车全都得等着。
除非你是在测试环境或者确定key的数量极少,否则绝对不要在生产环境使用KEYS命令,有什么更安全、更快速(这里快速指的是对服务影响小,能渐进式获取)的方法呢?主要有两种替代方案:SCAN命令和通过第三方工具。
首选方案:使用 SCAN 命令
这是Redis官方推荐的、用于替代KEYS命令的标准方法,它的核心思想是“迭代式”或“游标式”的查找,而不是一次性搞定。
你可以把Redis的key空间想象成一本很厚的字典。KEYS命令是让你从第一页开始,一页一页翻到最后一页,把所有词条都抄下来才结束,中间不能干别的,而SCAN命令则是每次只翻几页,抄下这几页的词条,然后告诉你一个位置(游标),你歇一会儿,或者处理一下刚才抄下来的词条,然后再从这个位置继续翻下一页。
具体怎么用呢?SCAN命令的基本用法是:
SCAN cursor [MATCH pattern] [COUNT count]
cursor:游标,第一次遍历时设置为0,表示开始一次新的迭代,之后每次命令返回的第一个值,就是下一次迭代需要使用的游标。MATCH pattern:可选参数,和KEYS命令后面的模式匹配一样,比如user:*。COUNT count:可选参数,提示Redis每次迭代大致返回多少个key。注意:这只是一个提示,不代表每次一定返回 exactly 这个数量,可能多也可能少,默认值是10,但在实际使用中,对于大key库,可以设置大一些,比如1000,以减少迭代的总次数。
使用SCAN命令的过程是一个循环:

- 发送
SCAN 0 MATCH your_pattern COUNT 1000 - Redis返回两个值:一个是下一次迭代的游标(比如
12345),一个是本次迭代获取到的key列表。 - 如果返回的游标不是
0,说明遍历还没结束,继续发送SCAN 12345 MATCH your_pattern COUNT 1000。 - 直到返回的游标是
0,表示整个遍历完成。
这种方法的好处是,每次操作都只占用很少的服务器时间,不会长时间阻塞,你可以在两次SCAN命令的间隔中处理已经获取到的key,或者处理其他业务请求,整个服务是平滑运行的。
重要提醒:在使用SCAN迭代的过程中,如果数据库中的key发生了变化(增、删、改),可能会遇到一些key被重复遍历或者被遗漏的情况,这是为了不阻塞服务而做的权衡,在大多数统计全量key的场景下是可以接受的,如果你需要绝对精确的、在某个时间点一致的快照,SCAN可能不太适合,但在99%的场景下,它都是最佳选择。
辅助方案:通过第三方工具或监控数据
除了在Redis命令行里操作,还有一些间接的方法可以让你了解到key的概况,虽然不是直接“拿到”所有key。

-
Redis自带的INFO命令:你可以运行
INFO keyspace命令,这个命令不会列出具体的key名,但它会快速返回每个数据库的概要信息,比如db0:keys=1000000,expires=100,这能让你在瞬间知道整个实例大概有多少个key,有多少个带过期时间的key,当你只是想知道key的数量规模而不是具体内容时,这个命令非常高效安全。 -
Redis RDB文件分析工具:如果你的目的是做离线分析,比如分析哪些key占用了大量内存、key的分布 pattern 等,一个非常强大的方法是从线上环境备份一个RDB文件(Redis的数据持久化文件),然后下载到你的开发机或者测试环境,使用第三方工具来分析这个文件,市面上有很多成熟的工具,比如
redis-rdb-tools(一个Python工具包),通过分析RDB,你可以安全、完整地获取到所有key的信息,包括类型、大小、过期时间等,而且对线上Redis服务零影响,这种方法特别适合数据仓库分析、容量规划等场景。 -
监控系统:一些成熟的Redis监控系统(如Prometheus+Grafana搭配Redis exporter)会定期通过
INFO命令或者SCAN命令采集key的数量和模式分布等指标,你可能不需要手动去获取所有key,而是直接去监控系统的仪表盘上查看历史趋势和统计数据。
快速(安全)获取Redis所有key的方法,核心就是避开阻塞式的KEYS命令。
- 在线、渐进式获取:毫不犹豫地使用
SCAN命令。 - 仅需知道数量:使用
INFO keyspace命令。 - 离线、深度分析:备份RDB文件并用专业工具分析。
在分布式系统中,任何一个可能阻塞服务的操作都需要极其谨慎地对待,选择正确的方法,既能完成任务,又能保证服务的稳定性。
本文由盈壮于2026-01-04发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/74109.html
