使用键我可以查询键,如下所示:
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*)
使用键我可以查询键,如下所示:
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*)
注意:正如其他人在对原始问题的评论中提到的那样,在生产环境中应该避免使用 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
任何重要的事情。