REDIS - 如何在一个查询中查询键并获取其值?

时间:2013-08-08 02:52:51

标签: redis

使用我可以查询按键,如下所示:

redis> set popo "pepe"
OK
redis> set coco "kansas" 
OK
redis> set cool "rock"
OK
redis> set cool2 "punk"
OK
redis> keys *co*
1) "cool2"
2) "coco"
3) "cool"
redis> keys *ol*
1) "cool2"
2) "cool"

有没有办法获取值而不是键?类似于:mget (keys *ol*)

1 个答案:

答案 0 :(得分:3)

注意:正如其他人在原始问题的评论中提到的那样,在生产环境中应该避免使用KEYS 。如果您只是在自己的盒子上运行查询并一起黑客攻击,那就去吧。否则,询问REDIS是否对您的特定应用程序有意义,如果您确实需要这样做 - 如果是这样,则施加限制并避免大量阻塞调用,例如KEYS。 (有关此方面的帮助,请参阅下面的 2015年编辑。)


我的笔记本电脑目前还没有现成可用于测试,但据我所知,没有任何本机命令可以让你以这种方式使用模式。如果您想在redis中完成所有操作,则可能必须使用EVAL来链接命令:

eval "return redis.call('MGET', unpack(redis.call('KEYS', KEYS[1])))" 1 "*co*"

(用您要搜索的任何模式替换最后的*co*。)

http://redis.io/commands/eval

注意:这会将字符串作为Lua脚本运行 - 我没有太多信息,所以我不知道它是否以任何方式清理输入。在使用之前(特别是如果您打算使用任何用户输入)测试进一步注入redis.call函数并查看它是否也进行了评估。如果有,那就要小心了。

编辑:实际上,这应该是安全的,因为redis和它的lua评估都不允许转义包含的字符串:http://redis.io/topics/security


2015编辑:自我的原始帖子以来,REDIS已发布2.8版,其中包含SCAN命令,该命令更适合此类功能。 它不适用于这个要求单线命令的确切问题,但它对所有合理的约束/环境更好。

有关SCAN的详细信息,请参阅http://redis.io/commands/scan

要使用此功能,基本上您可以使用scan ${cursor} MATCH ${query} COUNT ${maxPageSize}(例如scan 0 MATCH *co* COUNT 500)来迭代数据集。在这里,cursor应始终初始化为0.

这会返回两件事:第一个是新的cursor值,可用于获取下一组元素,第二个是与query匹配的元素集合。您只需不断更新cursor,调用此查询直到cursor再次为0(意味着您已遍历所有内容),并将找到的元素推送到集合中。

我知道SCAN听起来更多的工作,但我恳请你,请使用这样的解决方案而不是KEYS来解决任何重要问题。