如何找到具有匹配模式的所有键的计数.
例如,有两个键abc:random-text-1
和abc:random-text-2
.这里的共同模式是abc:
.所以,这里的计数是2.
我怎样才能在redis中做到这一点?
免责声明我希望这个旧的答案没有损坏任何拥有数百万个密钥的生产系统.如果由于某种原因仍想在生产中仍然计算redis的匹配键,最好使用匹配模式扫描.
如果您只是使用KEYS进行搜索,使用redis客户端,您将获得所有匹配键的数字列表,对吧?
例如
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
如果它是一次性的,你可以按照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"
通过考虑性能,我不建议你使用 KEYS
警告:将KEYS视为仅应在生产环境中使用的命令.在针对大型数据库执行时可能会破坏性能.此命令用于调试和特殊操作,例如更改键空间布局.不要在常规应用程序代码中使用KEYS.如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用集合.
如果您的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"
从这里:
eval "return #redis.pcall('keys', 'abc:*')" 0
它不是O(1),但至少计数是在服务器端完成的.