【发布时间】:2013-12-23 11:41:46
【问题描述】:
我怎样才能找到具有匹配模式的所有键的计数。
例如,有两个键 abc:random-text-1 和 abc:random-text-2 。这里的常见模式是abc:。所以,这里的计数是 2。
如何在 redis 中做到这一点?
【问题讨论】:
-
在生产环境中计算 Redis 中的键永远是个坏主意。
标签: redis node-redis
我怎样才能找到具有匹配模式的所有键的计数。
例如,有两个键 abc:random-text-1 和 abc:random-text-2 。这里的常见模式是abc:。所以,这里的计数是 2。
如何在 redis 中做到这一点?
【问题讨论】:
标签: redis node-redis
【讨论】:
keys 命令,这可能会导致大型实例的性能中断。
免责声明我希望这个旧答案没有损坏任何拥有数百万个密钥的生产系统。如果你出于某种原因仍然想统计生产中redis的匹配键,better use scan with a match pattern。
如果你只是用 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
【讨论】:
考虑到性能,我不建议你使用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"
【讨论】:
scan 来计算与模式匹配的键的数量,那将会很有帮助。
如果它是一次性的,您可以按照 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"
【讨论】: