Php redis如何获取某个前缀的键数?

Php redis如何获取某个前缀的键数?,php,redis,Php,Redis,我想获得某个前缀的键数,类似于: count($redis->keys('user_*')); 但是它不适用于像这样的大量键的情况您可以使用改进。看 如果你想用一个命令就能得到它们,最好的办法就是 local keys = redis.call('KEYS', ARGV[1]) return table.getn(keys) 用作: EVAL "local keys = redis.call('KEYS', ARGV[1]) \n return table.getn(keys)" 0

我想获得某个前缀的键数,类似于:

count($redis->keys('user_*'));

但是它不适用于像这样的大量键的情况

您可以使用改进。看

如果你想用一个命令就能得到它们,最好的办法就是

local keys = redis.call('KEYS', ARGV[1])
return table.getn(keys)
用作:

EVAL "local keys = redis.call('KEYS', ARGV[1]) \n return table.getn(keys)" 0 user_*
> EVAL "local keys = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2], 'COUNT', ARGV[3]) \n return {keys[1], table.getn(keys[2])}" 0 0 user_* 100
1) "1000"
2) (integer) 101
但这仍然会阻止服务器扫描整个数据库,因为Redis是单线程的。您在这里仅保存缓冲和网络负载

要在不长时间阻塞服务器的情况下计数,可以使用。这将基本上将数据库扫描分解为几个步骤。首先,将
游标设置为零进行调用,然后在后续调用中传递返回的游标

local keys = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2], 'COUNT', ARGV[3])
return {keys[1], table.getn(keys[2])}
用作:

EVAL "local keys = redis.call('KEYS', ARGV[1]) \n return table.getn(keys)" 0 user_*
> EVAL "local keys = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2], 'COUNT', ARGV[3]) \n return {keys[1], table.getn(keys[2])}" 0 0 user_* 100
1) "1000"
2) (integer) 101
numkeys
之后传递的三个参数是
cursor
pattern
count

第一个返回值是下一个
光标
,第二个整数值是此迭代中的键数

有关
计数
值选择,请参阅

请参见如何使用光标推断进度百分比

一般的做法似乎是使用
scan()