与模式匹配的密钥数

我怎样才能find具有匹配模式的所有键的计数。

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

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

如果您只需使用KEYS进行search,则使用您的redis客户端,您将获得所有匹配键的编号列表,对不对?

例如

 KEYS abc:* 

会给你

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

或者可以运行以下命令:

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

你会得到2作为输出。

从这里 :

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

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

考虑到性能,我不会推荐你使用KEYS

警告:将KEYS看作只能在生产环境中谨慎使用的命令。 对大型数据库执行操作可能会导致性能下降。 此命令用于debugging和特殊操作,例如更改您的键盘空间布局。 不要在您的常规应用程序代码中使用KEYS。 如果您正在寻找一种方法在您的密钥空间的子集中查找密钥,请考虑使用集合。

我build议你考虑扫描 ,如果你的redis版本> 2.8.0。 但是它依赖于你将要使用的数据types。

以下是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" 

如果是一次性事物,可以使用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" 

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