打印Redis中的键数


164

有没有办法打印Redis中的键数?

我知道

keys *

但这似乎有点沉重。-鉴于Redis是键值存储,也许这是唯一的方法。但是我仍然希望看到一些类似的东西

count keys *

4
有COUNT个请求请求,但被拒绝了。github.com/antirez/redis/pull/32 antirez也在KEYS上发表了评论
亚历克斯(Alex

我想知道他们是否不支持它,因为它会是O(n)-猜想这证实了这一点。
安迪

Answers:


199

您可以发出INFO命令,该命令返回有关服务器的信息和统计信息。请参阅此处的示例输出。

如mVChr的评论中所述,您可以info keyspace直接在redis-cli上使用。


1
redis-cli INFO Keyspace | grep ^db
Hackaholic

164

DBSIZE 返回键的数量,并且解析起来更容易。

缺点:如果密钥已过期,它可能仍然有效。

http://redis.io/commands/dbsize


3
在该示例中,KEYS *将过期的密钥逐出。同样,Redis 可能会主动退出某些过期的密钥,但不一定要全部撤消。
seppo0010

45

警告:请勿在生产机器上运行此程序。

在Linux机器上:

redis-cli KEYS "*" | wc -l

注意:如下面的注释中所述,这是一个O(N)操作,因此在具有许多键的大型DB上,您不应使用此操作。对于较小的部署,应该没问题。


3
非常方便,并且还可以过滤键。
Nick Farina

25
那是一个O(n)操作,在O(1)中有什么方法可以做到这一点吗?
Zoozy

21
不要在生产环境中的大型数据库上使用。KEYS Command
Mantas

4
有人会读这本书,有一天会在生产盒上这样做,而不用考虑它,然后将其推到边缘……可能已经发生了。
斯图·汤普森

2
应该有一个免责声明,仅可在非生产服务器上使用。否则,您应该使用redis.io/commands/SCAN
whitfin




4

dbsize() 返回键的总数。

您可以通过随机采样键,然后检查与模式匹配的键的一部分来快速估计与给定模式匹配的键的数量。

python中的示例;计算所有以prefix_:开头的键

import redis
r = redis.StrictRedis(host = 'localhost', port=6379)
iter=1000
print 'Approximately', r.dbsize() * float(sum([r.randomkey().startswith('prefix_') for i in xrange(iter)])) / iter

iter=100与相比,即使在我的情况下也给出了不错的估计keys prefix_

一种改进是在每个请求上采样1000个键,但保留总数,以便在两个请求之后将除以2000,在三个请求之后将除以3000。因此,如果您的应用程序对总数感兴趣经常匹配密钥,那么每次它将越来越接近真实值。


1

在Redis 2.6之后,INFO命令的结果按部分划分。在“键空间”部分中,有“键”和“过期的键”字段来告诉您有多少个键。


4
这是不正确的。这是该部分的示例输出:#Keyspace db0:keys = 366,expires = 366此处,“ keys”指示密钥总数,而“ expires”指示未设置有效期的密钥。从本质上讲,这意味着它们已设置ttl并且已设置为过期,而不是已过期。
2013年

-1
eval "local count = redis.call('scan', 0, 'match', 'key:*:key', 'count', 10000) if count ~= 0 then return #count[2] end " 0

eval "local count = redis.call('sscan', 'key.key:all', 0, 'match', '*', 'count', 1000000) if count ~= 0 then return #count[2] end " 0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.