82

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

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

我怎样才能在redis中做到这一点?

4

5 回答 5

76

这里

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

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

于 2014-11-11T11:08:02.757 回答
74

免责声明我希望这个旧答案没有损坏任何具有数百万个密钥的生产系统。如果您出于某种原因仍想在生产中计算 redis 的匹配键,最好使用带有匹配模式的扫描

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

例如

KEYS abc:*

会给你

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

或者您可以运行以下命令:

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

你会得到2一个输出。

于 2013-12-06T11:24:34.190 回答
25

从命令行,redis-cli --scan --pattern 'abc:*' | wc -l

于 2017-08-11T22:24:31.853 回答
21

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

警告:将 KEYS 视为仅应极其小心地在生产环境中使用的命令。当它针对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用 KEYS。如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用集合。

如果您的 redis 版本 > 2.8.0,我建议您考虑scan 。但这取决于您要使用的数据类型。

这是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"
于 2014-03-11T14:19:44.983 回答
14

如果它是一次性的,您可以使用 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"
于 2013-12-07T15:31:46.407 回答