当前位置:首页 > 问答 > 正文

用Redis怎么快速查所有键和值,顺便看看都有哪些数据存着

*在生产环境中,绝对不要使用 `KEYS 命令来查看所有键。** 这是很多刚开始使用Redis的人最容易犯的错误,原因在于,Redis是单线程的,这意味着它在任何一个时刻只能处理一个命令。KEYS *` 命令会一次性遍历整个数据库的所有键名,如果你的数据库里有几百万甚至上亿个键,这个命令会长时间阻塞Redis服务器,导致在此期间所有其他客户端发来的读写请求全部无法响应,很可能引发线上服务雪崩,这是一个非常危险的操作,任何负责任的教程或文档都会首先强调这一点。

正确、安全的方法是什么呢?答案是使用 SCAN 命令。SCAN 命令的优势在于它是迭代式的、非阻塞的,它不会一次性返回所有键,而是每次只返回一小部分(比如几十个或几百个),并给你一个游标(cursor),你可以拿着这个游标再次调用 SCAN,继续获取下一批键,这样就把一个庞大的、耗时的操作,分解成了很多个快速的、小型的操作,虽然从整体上看,遍历所有键的总时间可能比 KEYS * 还要长一点,但在这个过程中,Redis服务器依然能够正常处理其他客户端的请求,不会造成服务中断。

如何使用 SCAN 命令查找所有键:

SCAN 命令的基本用法是 SCAN cursor [MATCH pattern] [COUNT count]

用Redis怎么快速查所有键和值,顺便看看都有哪些数据存着

  • cursor:游标,第一次遍历时从0开始,每次命令返回后会给你一个新的游标。
  • MATCH pattern:可选参数,用来匹配键的模式,user:* 表示查找所有以 user: 开头的键。
  • COUNT count:可选参数,提示Redis每次返回大约多少个键,但这只是一个提示,实际返回的数量可能多也可能少,默认值是10。

遍历的过程是一个循环:

  1. 第一次调用 SCAN 0,Redis会返回两个值:一个是下一次迭代需要的游标(比如是 45),另一个是本次扫描到的键的列表。
  2. 第二次调用 SCAN 45,又返回一个新的游标(比如是 109)和一批新的键。
  3. 如此反复,直到Redis返回的游标是 0,这表示整个数据库已经被遍历完毕,所有键都已经被找出来了。

这个过程非常适合用脚本(比如Shell脚本、Python脚本)来自动化完成,你可以写一个简单的循环,不断调用 SCAN 直到游标归零,然后把所有键收集到一个列表里。

如何查看键对应的值?

用Redis怎么快速查所有键和值,顺便看看都有哪些数据存着

拿到了所有键的列表后,下一步就是查看它们的值了,这里没有一条命令能直接“获取所有键值对”,你需要对每个键单独使用类型对应的查询命令,因为Redis支持多种数据结构(字符串、哈希、列表、集合、有序集合等),所以在获取值之前,你最好先知道这个键存储的是什么类型的数据,可以使用 TYPE keyname 命令来查看键的类型。

根据不同的类型,使用不同的命令来获取值:

  • 字符串(String):这是最简单的,直接用 GET keyname
  • 哈希(Hash):使用 HGETALL keyname,它会把这个哈希表的所有字段和值都列出来。
  • 列表(List):使用 LRANGE keyname 0 -1-1 表示列表的最后一个元素,这样就能获取整个列表。
  • 集合(Set):使用 SMEMBERS keyname,列出集合中的所有成员。
  • 有序集合(ZSet):使用 ZRANGE keyname 0 -1 WITHSCORES,会列出所有成员及其对应的分数。

一个实际的浏览场景:

用Redis怎么快速查所有键和值,顺便看看都有哪些数据存着

假设你只是想快速浏览一下数据库里存了些什么,而不是要程序化地处理所有数据,一个比较高效的做法是结合使用 SCANTYPE 命令,再抽样查看。

  1. 先用 SCAN 命令迭代,每次获取一小批键(比如20个)。
  2. 对于这一批键,你可以用 TYPE 命令快速查看它们的类型。
  3. 从中挑选几个有代表性的键,根据其类型使用上面的取值命令看看具体内容,你看到有几个键是 user:profile:1001,类型是hash,你就可以用 HGETALL user:profile:1001 看看里面到底存了用户的哪些信息(名字、年龄等),看到一些 page:view:20240501 这样的键,类型是string,可以用 GET 看看是不是当天的页面访问量。

通过这种抽样查看的方式,你就能对数据库里存了哪些数据有一个大致的了解,同时又避免了性能风险。

其他有用的诊断命令:

除了上面说的,还有几个命令能帮你了解数据的宏观情况,而不用遍历每一个键:

  • INFO keyspace:这个命令会简洁地列出所有数据库(db0, db1等)的统计信息,主要是每个数据库的键数量(keys)和设置过期时间的键数量(expires),这能让你快速知道数据大概有多大。
  • DBSIZE:直接返回当前数据库的键总数,非常快,不会阻塞服务。

总结一下安全快速的步骤:

  1. 绝对不用 KEYS *
  2. DBSIZEINFO keyspace 快速了解数据规模。
  3. SCAN 命令迭代式、分批次地获取所有键名。
  4. TYPE 命令查看关键键的类型。
  5. 根据类型,用 GETHGETALLLRANGE 等命令抽样查看具体内容。

如果你有权限并且环境允许,使用像RedisInsight这样的图形化管理工具会是更直观的选择,这些工具在背后也是使用 SCAN 等命令,但它们提供了友好的界面,可以让你方便地浏览键、查看值、分析内存使用情况,比自己敲命令要省事很多。