在Redis中是否有一个类似于MGET的HASH数据结构的命令?

时间:2016-06-28 01:33:23

标签: redis

我需要在一次调用中获取一组已知REDIS哈希键的所有数据字段。我已经将MGET用于字符串键,例如:

MGET键[键...]

自1.0.0起可用。

时间复杂度:O(N)其中N是要检索的键数。

返回所有指定键的值。对于不保存字符串值或不存在的每个键,返回特殊值nil。因此,操作永远不会失败。

HMGET仅为一个键带来所有字段。我需要钥匙所有领域的许多钥匙。

2 个答案:

答案 0 :(得分:1)

没有这样的命令,redis哈希在哈希中工作,因此HMGET在一个哈希内部工作,并给出该哈希中的所有字段。 无法访问多个哈希值中的所有字段

但是,您可以在每个哈希上使用多个HMGET并获取所有字段。您可以将这些命令管道化,以便一次执行。

选项1 防爆。伪代码实现

Pipeline p
List<String> = p.hgetall('key1', fields...); 
List<String> = p.hgetall('key2', fields...);
List<String> = p.hgetall('key3', fields...);
p.exec(); 

选项2 其他选项是编写LUA脚本并使用EVAL

调用它
local array = {}
local keys = redis.call('KEYS', '<your pattern>')

for _,key in ipairs(keys) do
    local val = redis.call('HGETALL', key)
    array[#array + 1] = val
end

return array

拨打lua sctipt

redis-cli EVAL "$(cat test.lua)" 0

1) 1) "field1"
   2) "val"
2) 1) "field1"
   2) "val"
   3) "field2"
   4) "val2"

答案 1 :(得分:0)

正如另一个答案所述,除了交易之外,还没有内置的方法,但还有更多的解决方法。

选项1:使用Lua脚本(即EVAL "..." 3 myhash1 myhash2 myhash3 myfield

local r = {}
while (#KEYS > 0) do
  local k = table.remove(KEYS,1)
  r[#r+1] = redis.call('HGET', k, ARGV[1])
end

return r

选项2:编写Redis模块

超出范围作为答案:)