Ruby 作为原子的Redis管道

Ruby 作为原子的Redis管道,ruby,redis,atomic,Ruby,Redis,Atomic,有没有一种方法可以以一个请求一个响应的方式实现以下内容 给定一个具有键名的redis集,每个键都有一个带有字段的redis哈希 我怎样才能一次性获取这些密钥的哈希值 像这样的事情,这是我能做的最好的事情(不确定这是否有效,但你明白了) hash=[] keys=redis.smembers(“myset”) redis.multi-do keys.map do|k| 哈希否,Redis没有一个命令可以同时返回多个键*的哈希值。你被n+1个请求困住了——一个请求获取密钥,一个请求获取一个密钥 您可

有没有一种方法可以以一个请求一个响应的方式实现以下内容

给定一个具有键名的redis集,每个键都有一个带有字段的redis哈希

我怎样才能一次性获取这些密钥的哈希值

像这样的事情,这是我能做的最好的事情(不确定这是否有效,但你明白了)

hash=[]
keys=redis.smembers(“myset”)
redis.multi-do
keys.map do|k|

哈希否,Redis没有一个命令可以同时返回多个键*的哈希值。你被n+1个请求困住了——一个请求获取密钥,一个请求获取一个密钥

您可以尝试编写一个Lua脚本,在Redis中完成所有这些工作并返回组合结果。有关Redis中脚本的介绍,请参阅的文档。请注意,如果执行此操作,则不能使用集群,因为必须向脚本显式提供密钥,才能使其在集群中安全



*不会为多个键返回值,但仅当它们是字符串时才返回值。

我了解到使用multi在一个网络请求中完成所有操作,不是吗?
multi
是一个事务的开始-它允许您一次提交或回滚所有更改,但它们仍然作为对Redis的单独调用执行。事实上,尽管生成键名或从DB读取它们(例如,
smembers
)违反了对Lua脚本使用“KEYS”数组参数的建议,并且在分片集群上运行会有问题
hashes = []
keys = redis.smembers("myset")
redis.multi do  
  keys.map do |k|
   hashes << redis.hgetall(k)
  end
end
hashes = hash.map(&:value) # to resolve future values