使用键我可以查询按键,如下所示:
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*)
答案 0 :(得分:3)
注意:正如其他人在原始问题的评论中提到的那样,在生产环境中应该避免使用KEYS 。如果您只是在自己的盒子上运行查询并一起黑客攻击,那就去吧。否则,询问REDIS是否对您的特定应用程序有意义,如果您确实需要这样做 - 如果是这样,则施加限制并避免大量阻塞调用,例如KEYS
。 (有关此方面的帮助,请参阅下面的 2015年编辑。)
我的笔记本电脑目前还没有现成可用于测试,但据我所知,没有任何本机命令可以让你以这种方式使用模式。如果您想在redis中完成所有操作,则可能必须使用EVAL
来链接命令:
eval "return redis.call('MGET', unpack(redis.call('KEYS', KEYS[1])))" 1 "*co*"
(用您要搜索的任何模式替换最后的*co*
。)
注意:这会将字符串作为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
来解决任何重要问题。