与模式匹配的键数

时间:2013-12-06 07:35:12

标签: redis node-redis

如何查找具有匹配模式的所有键的计数。

例如,有两个键abc:random-text-1abc:random-text-2。这里的常见模式是abc:。所以,这里的计数是2。

我怎样才能在redis中执行此操作?

4 个答案:

答案 0 :(得分:53)

免责声明我希望这个旧答案没有损坏任何拥有数百万个密钥的生产系统。如果由于某种原因仍希望仍在生产中计算redis的匹配键,better use scan with a match pattern

如果您只是使用您的redis客户端使用KEYS进行搜索,您将获得所有匹配键的数字列表,对吧?

e.g。

KEYS abc:*

会给你

1) abc:random-text-1
2) abc:random-text-2

或者您可以运行以下内容:

./redis-cli KEYS "abc:*" | wc -l

您将获得2作为输出。

答案 1 :(得分:51)

来自here

eval "return #redis.pcall('keys', 'abc:*')" 0

它不是O(1),但至少计数是在服务器端完成的。

答案 2 :(得分:19)

通过考虑性能,我不建议您使用KEYS

  

警告:将KEYS视为仅应在其中使用的命令   生产环境非常谨慎。它可能会破坏性能   当它针对大型数据库执行时。这个命令是有意的   用于调试和特殊操作,例如更改密钥空间   布局。不要在常规应用程序代码中使用KEYS。如果你是   想一想在键空间的子集中查找键的方法,请考虑   使用套装。

我建议你考虑scan,如果你的redis版本> 2.8.0。但它依赖于您将要使用的数据类型。

以下是redis doc的简单示例:

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"

答案 3 :(得分:12)

如果它是一次性的,你可以按照x_maras的描述使用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"