我该如何找到所有具有匹配模式的键的计数。
例如,有两个键abc:random-text-1
和abc:random-text-2
。这里的共同模式是abc:
。所以,在这里计数为2。
在redis中,我该怎么做?
我该如何找到所有具有匹配模式的键的计数。
例如,有两个键abc:random-text-1
和abc:random-text-2
。这里的共同模式是abc:
。所以,在这里计数为2。
在redis中,我该怎么做?
免责声明 我希望这个旧回答没有损坏任何拥有数百万键的生产系统。 如果你仍然出于某种原因想要在生产中统计redis匹配键的数量,最好使用带有匹配模式的扫描命令。
如果你只是通过redis客户端使用KEYS进行搜索,你将得到所有匹配键的编号列表,对吗?
例如:
KEYS abc:*
会给你
1) abc:random-text-1
2) abc:random-text-2
或者您可以运行以下命令:
./redis-cli KEYS "abc:*" | wc -l
你将会得到2
作为输出。
通过命令行执行:redis-cli --scan --pattern 'abc:*' | wc -l
127.0.0.1:6379> keys abc*
1) "abc123"
2) "abc456"
3) "abc234"
现在尝试访问它:从命令行运行 redis-cli --scan --pattern 'abc*' | wc -l以下是响应:localhost@username~$ redis-cli --scan --pattern 'abc*' | wc -l
3
- Pankaj Chauhan考虑到性能,我不建议您使用KEYS
命令。
警告:将
KEYS
命令仅用于需要特别注意的生产环境中。当针对大型数据库执行该命令时,可能会破坏性能。此命令旨在进行调试和特殊操作,例如更改键空间布局。请勿在常规应用程序代码中使用KEYS
。如果您要查找子集中的键的方法,请考虑使用集合。
如果您的redis版本> 2.8.0,则建议您考虑使用scan命令。但它依赖于您将要使用的数据类型。
下面是来自redis文档的简单示例:
redis 127.0.0.1:6379> sadd myset 1 2 3 foo foobar feelsgood
(integer) 6
redis 127.0.0.1:6379> sscan myset 0 match f*
1) "0"
2) 1) "foo"
2) "feelsgood"
3) "foobar"
scan
命令计算匹配模式的键数的简单命令将会很有帮助。 - hasen如果只是一次性的操作,你可以像x_maras所描述的那样使用KEYS,但在代码中不应该使用KEYS,因为每次调用它时,KEYS将扫描整个数据库中的每个键。
如果你需要频繁执行此操作,正如你所写的那样,没有确切的“好”方法,因为扫描每个键始终相当低效(即使使用SCAN,因为它会以更安全的方式执行与KEYS相同的操作)。
然而,如果你提前知道所需的模式,你可以保留一个匹配该模式的每个键的集合。
SET abc:random-text-1 "blah"
SADD patterns:abc abc:randomtext-1
SET abc:random-text-2 "more blah"
SADD patterns:abc abc:randomtext-2
SCARD patterns:abc
// (integer) 2
SORT patterns:abc BY nosort GET *
// 1) "blah"
// 2) "more blah"