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()
。