Redis:查找与模式匹配的键

48

我该如何找到与此类似的键:

例如:

我有一些键:

abc:parent1

abc:parent2

abc:parent1:child1

abc:parent2:child2

如何只查找以下键:

abc:parent1

abc:parent2

2个回答

54

由于它的工作方式,"Keys"命令被特别指出不应在生产环境中运行。你需要在这里创建一个键的索引。使用set来存储你想要的模式的键名称。当你添加一个新的键时,将其名称添加到集合中。例如:

Set abc:parent1:child1 breakfast
Sadd abc:parent1:index abc:parent1

当您需要该列表时:

Smembers abc:parent1:index

提供列表,无需使用“邪恶”的keys命令所带来的罚款和问题。此外,在删除键时使用可以删除一个条目。您还可以通过一次调用获得索引中有多少个键的好处。

如果您绝对、坚决地必须避免使用索引,请使用SCAN而不是keys。唯一应该考虑使用keys的时间是,如果您正在运行一个调试从服务器,唯一使用它的进程是您的调试进程。


我不太明白这应该如何工作。在你的例子中,实际上应该是:set abc:parent1:child1 breakfast 然后 sadd abc:parent1 child1 - Automatico
不行,因为原帖作者只想要parent1的级别而不是child的。 - The Real Bill
我误解了问题,谢谢澄清。 - Automatico
我还是有点困惑。OP想要找到“abc:parent1 abc:parent2”,难道不应该是sadd abc abc:parent1和sadd abc abc:parent2,然后再用smembers abc吗? - ealeon
警告:请谨慎使用KEYS命令,仅在生产环境中使用。当针对大型数据库执行时,它可能会破坏性能。此命令旨在用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用KEYS。如果您正在寻找在键空间子集中查找键的方法,请考虑使用SCAN或sets。 - snyderxc
显示剩余3条评论

31

如果不是在生产环境下,KEYS pattern 命令可以帮助您实现相同的功能。(永远不要在生产环境中使用 keys 命令)

例如:

redis> MSET one 1 two 2 three 3 four 4
OK
redis> KEYS *o*
1) "two"
2) "one"
3) "four"

对于您的具体示例,以下命令将起作用:

redis 127.0.0.1:6379> keys *parent[0-9]
1) "abc:parent2"
2) "abc:parent1"

这里是该命令的详细描述.

更新: 尽管上述建议可以帮助您获得所需的输出,但Redis KEYS 命令与其他人提到的一样邪恶。 KEYS 是阻塞的,而且在准备响应时可能会消耗大量RAM。

在常规应用程序代码中不要使用KEYS。如果您想要在键空间的子集中查找键的方法,请考虑使用SCAN或sets。

感谢 The Real Bill 和 Itamar,我有了更好的理解。


你如何处理 permission:/url1/id/sub:writepermission:/url1/id:write 以仅匹配 permission:/url1/[^/]+ - Natim
11
“KEYS”并不是邪恶的,将其用于生产代码才是有问题的。作为开发工具,它非常宝贵。 - Madbreaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接