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

Redis里怎么快速查键值对数量,简单又实用的方法分享

想知道Redis里存了多少个键值对,这是很常见的一个需求,比如你想看看缓存是不是快满了,或者只是单纯想了解一下数据量,这里就分享几个简单又实用的方法,咱们不用那些晦涩的专业术语,就用大白话讲清楚。

最直接的法子:DBSIZE 命令

如果你只是想知道当前数据库里总共有多少个键,那DBSIZE命令绝对是你的首选,这个方法简单到不能再简单了。

怎么用呢?打开你的Redis客户端(比如用redis-cli连上服务器),然后直接输入DBSIZE,敲下回车,数字立刻就出来了。

举个例子:

0.0.1:6379> DBSIZE
(integer) 150342

这行结果的意思就是,当前的数据库里一共有150342个键值对。

它为啥快? 根据Redis官方文档的说明,DBSIZE命令的速度是极快的,基本上是常数时间复杂度O(1),这是什么意思呢?就是说,不管你的Redis里存了1万个键还是10亿个键,你执行DBSIZE命令得到结果所花的时间几乎是一样的,为什么会这样?因为Redis在内部自己维护了一个计数器,每当你增加或者删除一个键的时候,这个计数器就会自动更新,所以DBSIZE命令根本不需要去遍历整个数据库,它只是把这个现成的数字读出来给你看而已,在你只关心总数的时候,用这个命令准没错。

什么时候需要注意? 虽然DBSIZE很快,但你要知道,Redis可以有多个数据库(默认是16个)。DBSIZE命令只告诉你当前所在的这个数据库的键数量,你可以用SELECT命令来切换不同的数据库,比如SELECT 1就切换到1号数据库,然后再用DBSIZE查看。

需要更详细情况时:INFO命令

你不仅想知道总共有多少键,还想了解一下Redis服务器更全面的状态,比如内存用了多少、连接了多少客户端等等,这时候,INFO命令就派上用场了。

输入INFO命令后,它会返回一大串信息,看起来可能有点乱,但我们可以只看我们关心的部分,你可以用INFO keyspace这个更精确的命令。

举个例子:

0.0.1:6379> INFO keyspace
# Keyspace
db0:keys=150342,expires=25,avg_ttl=1234567

这一小段结果就非常有用了,它告诉我们:

  • db0:表示0号数据库。
  • keys=150342:这个数据库总共有150342个键。
  • expires=25:其中有25个键是设置了过期时间的。
  • avg_ttl=1234567:这些设置了过期的键,平均剩余存活时间大概是1234567毫秒。

你看,通过INFO keyspace,你不仅能拿到总数,还能顺带知道有多少键是“临时”的,这些信息也是Redis服务器实时统计好的,所以获取速度也非常快。

万不得已才用的方法:KEYS命令

你可能在网上搜的时候,会看到有人说用KEYS *命令,这个命令确实能列出所有的键,你再去数一下列表的长度,也能知道总数。

*我必须非常严肃地提醒你:在生产环境中,除非你非常清楚你在做什么,否则绝对不要使用`KEYS `命令!**

为什么呢?因为KEYS命令的工作原理是遍历整个数据库,就像你在一个巨大的仓库里,不开灯,非要用手电筒一个一个货架地找东西一样,如果你的数据库里有几百万甚至上千万个键,这个命令可能会让Redis服务器“卡住”好几秒钟,在这段时间内,Redis就无法处理其他任何来自客户端的请求了,这很可能导致你的线上服务瘫痪或超时。

根据Redis官方文档的警告,KEYS命令只能用于调试环境或者确保数据量极小的情况下,它的速度是O(N),N就是数据库中键的数量,数据量一大,速度会呈线性增长,非常可怕。

那如果我真的需要模式匹配查找某些键怎么办?Redis提供了一个更安全的替代命令叫做SCANSCAN命令也是迭代遍历,但它是分步进行的,每次只返回一小部分键,不会长时间阻塞服务器,如果你仅仅是为了统计总数,那还是用DBSIZE最好,SCAN通常用于需要逐个处理键的场景。

简单总结一下:

  • 只想知道总数,图快图省事:DBSIZE,这是最推荐的方法。
  • 想顺便看看数据库的整体键空间情况(比如有多少带过期时间的):INFO keyspace
  • 没事儿别用: KEYS *命令,尤其是在生产环境,风险很高。

最后再提一点,这些命令给出的都是当前这个Redis实例、当前你选中的这个数据库里的数据情况,如果你的数据分布在Redis集群(Redis Cluster)上,那么情况会复杂一些,因为数据是分片存储在多个节点上的,你需要把每个节点的键数量加起来才能得到全局的总数,对于大多数单实例或者主从架构的Redis来说,上面说的DBSIZEINFO命令就完全够用了,希望这些简单直接的方法能帮到你。

Redis里怎么快速查键值对数量,简单又实用的方法分享