Redis如何在一个查询中获取多个键的值?

3

Redis中是否有一个命令可以在单个查询中获取多个键的值?

实际上,我的键都是SET类型的,所以我想获取它们所有的值,但是由于MEMBERS只接受一个KEY作为参数,所以是否可能在一次查询中完成。


你担心什么多个查询? - for_stack
假设我需要获取5000个键的值,现在我需要发出5000个Redis查询,难道不觉得如果结果可以在一个查询中返回会更好吗? - Sudhanshu Gaur
1
在单个查询中获取太多数据是一个不好的想法。因为Redis在处理请求时是单线程的。如果您尝试在单个查询中获取5000个集合的成员,它将会长时间地阻塞Redis,并且其他客户端将无法从Redis读取或写入。此外,这将使Redis占用过多的内存来准备这个巨大的响应。 - for_stack
@for_stack 从来没有考虑过这个问题,那么如果要执行100个查询,可能50次会是最优解吗?这样会更好吗? - Sudhanshu Gaur
正如@Supermacy在他的回答中提到的那样,没有这样的命令。我仍然认为获取多个集合的所有成员不是一个好主意。事实上,如果集合非常大,获取单个集合的所有成员也是一个坏主意。相反,您可能需要使用SSCAN命令。 - for_stack
如果您坚持要在单个查询中获取多个集合的成员,您可以编写一个Lua脚本来完成这项工作。 - for_stack
3个回答

2
你无法在一次查询中获取多个集合的值。你需要多次查询数据库。
然而,你可以使用单个查询进行涉及多个集合的操作。此类操作的命令为:
  • SDIFF- 返回第一个集合与所有后续集合之间差异结果的成员。

  • SINTER- 返回所有给定集合交集的成员。

  • SUNION- 返回所有给定集合并集的成员。

2
我认为以下文档可能会对你有所帮助:http://redis.io/commands/sunion 我曾经遇到过这样的问题,并发现了 Redis 的这种功能。如果你只需要值,而不需要知道值的键,那么这正是你需要的。
我检查了超过 667 个键的性能。以下是结果:

enter image description here

方法1是667个按顺序发送的请求。
方法2是667个并发请求。
方法3使用了“sunion”。

0
不严格地说,这不是一个单一的“查询”。
如果您不想使用联合查询,只是想节省往返时间,请使用pipelining。 例如,像这样的事务-
multi
   smembers mykey1
   smembers mykey2
exec

Redis客户端具有管道机制,所有查询将被排队在您的应用程序缓冲区中,并一次性发送到Redis服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接