0

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

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*)

4

1 回答 1

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任何重要的事情。

于 2013-08-08T03:36:53.900 回答