在Redis中有办法打印键的数量吗?

我知道

keys *

但这似乎有点沉重。考虑到Redis是一个键值存储,也许这是唯一的方法。但我还是希望看到一些类似于

count keys *

您可以发出INFO命令,该命令返回关于服务器的信息和统计信息。请看这里的示例输出。

正如mVChr在评论中提到的,你可以直接在redis-cli中使用info keyspace。

redis> INFO
# Server
redis_version:6.0.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:b63575307aaffe0a
redis_mode:standalone
os:Linux 5.4.0-1017-aws x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:9.3.0
process_id:2854672
run_id:90a5246f10e0aeb6b02cc2765b485d841ffc924e
tcp_port:6379
uptime_in_seconds:2593097
uptime_in_days:30
hz:10
configured_hz:10
lru_clock:4030200
executable:/usr/local/bin/redis-server

DBSIZE返回键的数量,更容易解析。

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

http://redis.io/commands/dbsize


警告:不要在生产机器上运行此程序。

Linux系统:

redis-cli KEYS "*" | wc -l

注意:正如下面的评论中提到的,这是一个O(N)操作,所以在一个有很多键的大数据库上,你不应该使用它。对于较小的部署,应该没问题。


在Redis 2.6版本中,INFO命令的结果被分段分割。在“keyspace”部分,有“keys”和“expired keys”字段来说明有多少个key。


因为Redis 2.6,支持lua,你可以得到这样的通配符键

eval "return #redis.call('keys', 'prefix-*')" 0

参见eval command


Dbsize()返回键的总数。

您可以通过随机抽样键来快速估计与给定模式匹配的键的数量,然后检查它们中有多少与模式匹配。

python中的示例;计数所有前缀_开头的键:

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。因此,如果应用程序经常对匹配键的总数感兴趣,那么每次它都会越来越接近真实值。


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

DBSIZE命令返回键的数量

> DBSIZE

进入redis-cli,使用以下命令

info keyspace

它可能会帮助到某人


显示DB的名称和键数:

redis-cli info keyspace
# Keyspace
db0:keys=12995,expires=0,avg_ttl=0
db12:keys=5524396,expires=5,avg_ttl=45201

显示编号。所选数据库中的键:

redis-cli dbsize
(integer) 12995

显示整个Redis的统计数据:

redis-cli info