【问题标题】:Is there MGET analog for Redis hashes?Redis 哈希是否有 MGET 模拟?
【发布时间】:2011-03-20 18:06:29
【问题描述】:

我打算开始使用散列而不是常规键。但我在 Redis wiki 中找不到任何关于多获取哈希键的信息。 Redis是否支持这种命令?

谢谢。

【问题讨论】:

  • 如果您的问题已经回答,请标记正确答案。谢谢。

标签: redis


【解决方案1】:

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

pipe = conn.pipeline()
pipe.hgetall('foo')
pipe.hgetall('bar')
pipe.hgetall('zar')
hash1, hash2, hash3 = pipe.execute()

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

阅读更多http://redis.io/topics/pipelining

【讨论】:

  • 这是一个非常古老的答案。目前redis有HMGET命令:redis.io/commands/hmget
  • hmget 不会让您获得多个哈希值。它可以让您获得多个字段
【解决方案2】:

如果 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"

【讨论】:

  • 这是一个很好的答案; SORT 非常快,尽管它做了很多“东西”,但它在服务器上完成,没有任何客户端往返。即使是管道命令,如果你发送很多,最终都会比SORT 慢。也许打败它的唯一方法是编写一个完全包含复杂查询的 Lua 脚本。
【解决方案3】:

没有 MHGETALL 但你可以 Lua 它:

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

return r

【讨论】:

  • 如何在 EVAL 命令中做到这一点?
【解决方案4】:

Redis 有一个HMGET 命令,它通过一个命令返回多个哈希键的值。

【讨论】:

  • 是的,但是 HMGET 将返回具体字段的多个值,但我需要返回整个哈希值(如 HGETALL 所做的code.google.com/p/redis/wiki/HgetallCommand)。无论如何,谢谢你的回答。
  • 撞!整个哈希是什么意思?使用HMGET,您可以获得查询键的所有值,并且由于您已经获得了键,并且每个键都有相应的值,因此您可以使用代码中的每个键/值对构建本地哈希。请解释。谢谢。
  • 如果在概念上使用哈希来保存用户,那么 HMGET 会为您获取例如具有指定 ID 的单个用户的用户名和密码。对于哈希,类似于 MGET 的等效方法将在给定一组 ID 的情况下一次性获取所有这些用户的用户名和密码。这就是区别。
  • 很难确定 OP 要求什么,但这可能不是。从对上述答案的支持来看,大多数登陆这里的人都想知道是否有一个 Redis 命令可以返回多个完整的 Redis 哈希值。没有。
【解决方案5】:

没有命令可以一次性完成,但是有一种方法可以“很好地”完成它,使用一个列表(或排序集)来存储哈希键,然后使用 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,它允许利用所有基于分数的命令。

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 2016-05-21
    • 2018-10-19
    • 2016-10-04
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多