Redis里到底存了多少数据啊,怎么查才知道有几条记录呢?
- 问答
- 2026-01-21 19:34:49
- 4
用户问“Redis里到底存了多少数据啊,怎么查才知道有几条记录呢?”,这其实是在问两个事情:一个是Redis数据库当前总共存储了多少数据量,另一个是怎么快速统计出里面到底有多少条键值对记录,这两个问题听起来有点像,但实际不是一回事,一个关乎内存大小,一个关乎条目数量,下面我就根据Redis官方文档里提到的一些命令,来详细说说怎么弄清楚这两个问题。
先说说怎么查看Redis里存了多少数据,这里指的是占用了多少内存空间,有时候我们感觉Redis变慢了,或者服务器内存快用满了,首先就想知道是不是Redis吃掉了太多内存,这时候,最直接了当的命令就是INFO memory,你可以在Redis的命令行界面(就是那个redis-cli)里输入这个命令,然后会刷出来一大堆信息,你不用慌,关键看其中几行就行了。used_memory_human这一行,它会用一个很人性化的单位(比如MB、GB)告诉你Redis当前实际使用了多少内存,还有used_memory_rss_human,这个指的是操作系统视角下Redis进程占用了多少物理内存(包含一些开销),通常会比used_memory大一点,通过看这两个数字,你就能对Redis的内存占用有个清晰的了解,知道它是不是个“内存大户”。(来源:Redis官方文档 - INFO命令)

用户问的“有几条记录”,通常指的是数据库里有多少个键(key),因为Redis是键值数据库,一条记录就是一个键值对,统计键的数量基本上就是统计记录数,这个需求非常常见,最简单粗暴的方法就是使用DBSIZE命令,你在命令行里输入DBSIZE,它几乎会立刻返回当前选中的数据库里key的总数,这个命令的优点是超级快,因为Redis自己就在内存里维护着这个计数器,不用去遍历所有key。(来源:Redis官方文档 - DBSIZE命令)
DBSIZE命令有个前提,它只能告诉你当前选中的那个数据库里有多少key,Redis默认有16个数据库(编号从0到15),你用redis-cli连上去,默认是在第0号库,如果你在其他库(比如用SELECT 1命令切换到了1号库)里存了数据,那么在0号库里执行DBSIZE是看不到1号库的key的,你得确保你在正确的数据库里执行这个命令,或者挨个数据库切换过去用DBSIZE查一遍,然后把数字加起来。

那如果我想一次性知道所有16个数据库里分别有多少key,甚至每个库有多大,该怎么办呢?这时候另一个命令INFO keyspace就派上用场了,你输入INFO keyspace,它会返回一个简单的报告,报告大概是这样的:db0:keys=100,expires=0,avg_ttl=0,db1:keys=50,expires=2,avg_ttl=12345,每一行代表一个数据库的状态。keys=后面的数字就是这个数据库里的总key数量,expires=是设置了过期时间的key的数量,avg_ttl是平均存活时间,这个命令可以让你一眼看清所有数据库的key分布情况,非常方便。(来源:Redis官方文档 - INFO命令)
说到这里,你可能会想,如果我不光想知道总数量,还想知道到底是哪些key,或者想统计某种特定模式的key(比如所有以user:123开头的key)有多少个,那又该怎么办呢?这就引出了一个需要特别小心的命令——KEYS命令,你可以用KEYS *来列出所有的key,或者用KEYS user:*来列出所有以user:开头的key,然后你再去数一下返回的列表有多少个元素,不就得到数量了吗?

我必须郑重警告你:在生产环境(就是正在线上服务的真实系统)里,极其不推荐直接使用KEYS命令,尤其是当你的Redis里存了几百万、上千万个key的时候。 为什么呢?因为KEYS命令的工作原理是遍历整个数据库的所有key,它是一个阻塞式的命令,也就是说,当Redis服务器在执行KEYS *这个遍历操作的时候,它会卡住,在这期间它就不能处理其他任何来自客户端的请求了(比如你的应用程序正在发起的读数据、写数据的命令),如果数据量很大,这个卡顿可能会持续好几秒甚至更长时间,这对于一个需要高并发、低延迟的线上服务来说,简直是灾难性的,很可能导致服务超时、瘫痪。(来源:Redis官方文档 - KEYS命令的警告部分)
既想统计特定模式的key,又不想让服务器卡死,有没有更好的办法呢?答案是有的,那就是使用SCAN命令。SCAN命令的作用和KEYS类似,也是用来查找匹配特定模式的key的,但它的巨大优势在于它是非阻塞的、迭代式的,它不会一次性把所有结果都返回给你,而是每次只返回一小部分,并给你一个游标(cursor),你可以拿着这个游标,再次调用SCAN,它就会从上次停下的地方继续扫描,这样就把一次性的巨大计算压力,分摊成了很多次微小的、快速的操作,服务器在每次SCAN调用的间隙,依然可以正常处理其他请求,不会造成明显的卡顿。(来源:Redis官方文档 - SCAN命令)
你可以写一个简单的脚本,用SCAN命令配合循环,来一点点地统计出符合你条件的key的数量,虽然速度上会比KEYS慢一点(因为要多次往返通信),但它是安全的,不会影响线上业务,这才是生产环境下进行此类操作的推荐做法。
要回答“Redis里存了多少数据,有几条记录”这个问题:
- 看总内存占用,用
INFO memory。 - 快速看当前数据库的key总数(记录数),用
DBSIZE。 - 想看所有数据库的key分布,用
INFO keyspace。 - 绝对要避免在生产环境使用
KEYS *来统计。 - 如果非要统计特定模式的key数量,请使用安全的
SCAN命令来慢慢遍历。
最后再啰嗦一句,这些命令都只是帮你查看和统计,如果你发现数据量确实太大了,或者有些key再也不用到了,那就要考虑是不是需要清理一下,比如给key设置过期时间,或者手动删除一些无用数据,这样才能让Redis一直保持轻盈高效。
本文由黎家于2026-01-21发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/84152.html