有Redis哈希的MGET模拟吗?

Is there MGET analog for Redis hashes?

我打算开始使用常规密钥的哈希散列。但是我在Redis Wiki中找不到有关哈希键的多重获取的任何信息。 Redis支持这种命令吗?

谢谢。


您可以查询哈希或管道中的任何键,即在对Redis实例的一个请求中。实际的实现取决于您的客户端,但是使用redis-py时,它看起来像这样:

1
2
3
4
5
pipe = conn.pipeline()
pipe.hgetall('foo')
pipe.hgetall('bar')
pipe.hgetall('zar')
hash1, hash2, hash3 = pipe.execute()

客户端将使用3个命令发出一个请求。这与一次将多个值添加到集合中的方法相同。

有关更多信息,请访问http://redis.io/topics/pipelining


如果SORT允许您使用->语法使用多个GET,并且所有散列都具有相同的字段,则可以通过将它们的名称放入集合中并对其进行排序来在批量答复中获得它们。

1
  SORT names_of_hashes GET *->field1 *->field2 *->field3 *->etc

但是您似乎无法通过哈希访问做到这一点。另外,您还必须自己将返回列表变回哈希值。

更新:如果您很好地命名哈希,Redis似乎可以让您获取多个字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
redis> hset hash:1 name fish
(integer) 1
redis> hset hash:2 name donkey
(integer) 1
redis> hset hash:3 name horse
(integer) 1
redis> hset hash:1 type fish
(integer) 1
redis> hset hash:2 type mammal
(integer) 1
redis> hset hash:3 type mammal
(integer) 1
redis> sadd animals 1
(integer) 1
redis> sadd animals 2
(integer) 1
redis> sadd animals 3
(integer) 1
redis> sort animals get # get hash:*->name get hash:*->type
1."1"
2."fish"
3."fish"
4."2"
5."donkey"
6."mammal"
7."3"
8."horse"
9."mammal"


MHGETALL,但您可以赞一下:

1
2
3
4
5
6
local r = {}
for _, v in pairs(KEYS) do
  r[#r+1] = redis.call('HGETALL', v)
end

return r

Redis具有HMGET命令,该命令可以通过一个命令返回多个哈希键的值。


没有命令可以一次性完成,但是有一种方法可以"很好"地使用列表(或排序集)存储哈希键,然后使用multi批量检索它们。

在PHP中:

1
2
3
4
5
6
7
8
9
10
$redis->zAdd("myHashzSet", 1,"myHashKey:1");
$redis->zAdd("myHashzSet", 2,"myHashKey:2");
$redis->zAdd("myHashzSet", 3,"myHashKey:3");

$members = $redis->zRange("myHashzSet", 0, -1);
$redis->multi();
foreach($members as $hashKey) {
    $redis->hGetAll($hashKey);
}
$results = $redis->exec();

我使用排序集进行命令,其中您将分数用作哈希的ID,它可以利用所有基于分数的命令。