2015-07-21 54 views
1

有没有办法以1请求1响应的方式获得以下内容?给予Redis的与主要名称和为每个键设置作为原子的Redis流水线

与领域

我如何可以获取这些密钥的散列一气呵成一个Redis的哈希?

这样的事情,这是我能做的最好的(不知道这会工作,但你的想法)

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 

但这确实至少两个请求(这是不是最好的,但确定),不知道如何Redis :: Future解析为值(如果它发送另一个请求或不)

回答

2

不,Redis没有一个命令会一次返回多个键*的哈希。你坚持n + 1个请求 - 一个获取密钥,另一个获取每个密钥。

您可以尝试编写一个Lua脚本,该脚本将在Redis中完成所有操作并返回组合结果。请参阅EVAL command的文档以获取有关Redis脚本的介绍。请注意,如果您这样做,则无法使用群集,因为密钥必须明确提供给脚本,以使其在群集中安全。


* MGET确实为多个键返回值,但只有当他们的字符串。

+0

我明白,使用多功能可以在一个网络请求中执行一切操作,不是吗? –

+0

'MULTI'是一个事务的开始 - 它允许您立即提交或回滚所有更改,但它们仍然作为对Redis的单独调用执行。 – jmruc

+1

事实上,尽管生成键名或从数据库中读取它们(例如'smembers')是违背了将“KEYS”数组参数用于Lua脚本的建议,并且在分片群集上运行会出现问题 –