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

REDIS-如何在一个查询中查询键并获取它们的值?,redis,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" 有没有办法得到值而不是键?类似于:m

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

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对您的特定应用程序是否有意义,以及您是否真的需要这样做—如果需要,请施加限制并避免大型阻塞调用,例如
。(有关这方面的帮助,请参见下面的2015年编辑。)


我的笔记本电脑目前还不能测试这一点,但据我所知,没有任何本机命令允许您以这种方式使用模式。如果您想在redis中完成这一切,您可能必须使用
EVAL
链接命令:

eval "return redis.call('MGET', unpack(redis.call('KEYS', KEYS[1])))" 1 "*co*"
(将末尾的
*co*
替换为您正在搜索的任何模式。)

注意:这将以Lua脚本的形式运行字符串-我没有深入研究它,所以我不知道它是否以任何方式清理了输入。在您使用它之前(特别是如果您打算使用任何用户输入),请在中测试注入更多redis.call函数,并查看它是否也对这些函数进行了评估。如果是这样,那就要小心了

编辑:实际上,这应该是安全的,因为redis和它的lua求值都不允许转义包含的字符串:


2015年编辑:自从我最初发表文章以来,REDIS发布了2.8版,其中包括
SCAN
命令,该命令更适合此类功能。它不适用于这个需要一行命令的确切问题,但它更适用于所有合理的约束/环境

有关
SCAN
的详细信息,请访问

要使用它,基本上您可以使用类似于
scan${cursor}MATCH${query}COUNT${maxPageSize}
(例如
scan 0 MATCH*co*COUNT 500
)的内容来迭代数据集。此处,
光标
应始终初始化为0

这将返回两个内容:第一个是一个新的
游标
值,您可以使用它来获取下一组元素,第二个是与
查询
匹配的元素集合。您只需不断更新
cursor
,调用此查询,直到
cursor
再次为0(意味着您已经对所有内容进行了迭代),然后将找到的元素推送到集合中


我知道,
SCAN
听起来需要做很多工作,但我恳求您,对于任何重要的事情,请使用这样的解决方案,而不是使用
键。

注意:正如其他人和我在对原始问题的评论中提到的那样,在生产环境中应避免使用键。如果你只是在你自己的盒子上运行查询并一起破解一些东西,那就去做吧。否则,请询问REDIS对您的特定应用程序是否有意义,以及您是否真的需要这样做—如果需要,请施加限制并避免大型阻塞调用,例如
。(有关这方面的帮助,请参见下面的2015年编辑。)


我的笔记本电脑目前还不能测试这一点,但据我所知,没有任何本机命令允许您以这种方式使用模式。如果您想在redis中完成这一切,您可能必须使用
EVAL
链接命令:

eval "return redis.call('MGET', unpack(redis.call('KEYS', KEYS[1])))" 1 "*co*"
(将末尾的
*co*
替换为您正在搜索的任何模式。)

注意:这将以Lua脚本的形式运行字符串-我没有深入研究它,所以我不知道它是否以任何方式清理了输入。在您使用它之前(特别是如果您打算使用任何用户输入),请在中测试注入更多redis.call函数,并查看它是否也对这些函数进行了评估。如果是这样,那就要小心了

编辑:实际上,这应该是安全的,因为redis和它的lua求值都不允许转义包含的字符串:


2015年编辑:自从我最初发表文章以来,REDIS发布了2.8版,其中包括
SCAN
命令,该命令更适合此类功能。它不适用于这个需要一行命令的确切问题,但它更适用于所有合理的约束/环境

有关
SCAN
的详细信息,请访问

要使用它,基本上您可以使用类似于
scan${cursor}MATCH${query}COUNT${maxPageSize}
(例如
scan 0 MATCH*co*COUNT 500
)的内容来迭代数据集。此处,
光标
应始终初始化为0

这将返回两个内容:第一个是一个新的
游标
值,您可以使用它来获取下一组元素,第二个是与
查询
匹配的元素集合。您只需不断更新
cursor
,调用此查询,直到
cursor
再次为0(意味着您已经对所有内容进行了迭代),然后将找到的元素推送到集合中


我知道
SCAN
听起来需要做很多工作,但我恳求您,对于任何重要的事情,请使用这样的解决方案,而不是
KEYS

使用KEYS(尤其是在Lua脚本中)是永远不安全的。充其量,当您有大量的键时,它将冻结Redis。在最坏的情况下,它将失败(由于返回的键的数量)。打得好,迪迪埃。更糟糕的是,管理所有这些键的方式太多使用键永远都不安全(尤其是在Lua脚本中)。充其量,当您有大量的键时,它将冻结Redis。在最坏的情况下,它将失败(由于返回的键的数量)。打得好,迪迪埃。更糟糕的是,如果在应用程序中管理过多的键而不使用KEYS命令,则会出现这种情况。这是一个调试功能。如果您需要,它将冻结Redis实例