我打算开始使用散列而不是常规键。但我在 Redis wiki 中找不到任何关于多获取哈希键的信息。Redis是否支持这种命令?
谢谢你。
您可以查询哈希或管道中的任何键,即在对您的 redis 实例的一个请求中。实际实现取决于您的客户端,但使用 redis-py 它看起来像这样:
pipe = conn.pipeline()
pipe.hgetall('foo')
pipe.hgetall('bar')
pipe.hgetall('zar')
hash1, hash2, hash3 = pipe.execute()
客户端将发出一个带有 3 个命令的请求。这与一次将多个值添加到集合中的技术相同。
如果 SORT 允许您使用 -> 语法的多个 GET,并且您的所有哈希具有相同的字段,您可以通过将它们的名称放入一个集合并对其进行排序来在批量回复中获取它们。
SORT names_of_hashes GET *->field1 *->field2 *->field3 *->etc
但看起来你不能通过哈希访问来做到这一点。另外,您必须自己将返回列表转回散列。
更新:如果您很好地命名哈希值,Redis 似乎可以让您获取多个字段:
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
,但你可以 Lua 它:
local r = {}
for _, v in pairs(KEYS) do
r[#r+1] = redis.call('HGETALL', v)
end
return r
Redis 有一个HMGET命令,它通过一个命令返回多个哈希键的值。
没有命令可以一次性完成,但是有一种方法可以“很好地”完成它,使用一个列表(或排序集)来存储哈希键,然后使用 multi 将它们作为批量检索。
在 PHP 中:
$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,它允许利用所有基于分数的命令。