gpt4 book ai didi

php - redis如何获取某个前缀的 key 数量?

转载 作者:行者123 更新时间:2023-12-03 06:41:24 24 4
gpt4 key购买 nike

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

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

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

最佳答案

您可以使用Lua scripts对此进行改进。参见predis examples of using EVAL here

如果您想通过一个命令来获取它们,则最好的方法是

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_*

但是,只要Redis是单线程的,只要扫描整个数据库,这仍然会阻塞服务器。您仅在此处保存缓冲和网络有效负载。

要计数而不长时间阻塞服务器,可以使用 SCAN 。基本上,这将对数据库的扫描分为几步。首先,您将 cursor设置为零进行调用,然后将返回的游标传递给后续调用。
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('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之后传递的三个参数是 cursorpatterncount

返回的第一个值是下一个 cursor,第二个整数值是此迭代中键的计数。

有关 COUNT值的选择,请参见 Is there any recommended value of COUNT for SCAN / HSCAN command in REDIS?

Redic `SCAN`: how to maintain a balance between newcomming keys that might match and ensure eventual result in a reasonable time?中了解如何使用光标推断进度百分比。

关于php - redis如何获取某个前缀的 key 数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60124610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com