我需要在一次调用中获取一组已知REDIS哈希键的所有数据字段。我已经将MGET用于字符串键,例如:
MGET键[键...]
自1.0.0起可用。
时间复杂度:O(N)其中N是要检索的键数。
返回所有指定键的值。对于不保存字符串值或不存在的每个键,返回特殊值nil。因此,操作永远不会失败。
HMGET仅为一个键带来所有字段。我需要钥匙所有领域的许多钥匙。
答案 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)
正如另一个答案所述,除了交易之外,还没有内置的方法,但还有更多的解决方法。
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
超出范围作为答案:)