代码之家  ›  专栏  ›  技术社区  ›  Kirzilla

Redis哈希是否有mget模拟?

  •  33
  • Kirzilla  · 技术社区  · 14 年前

    我计划开始使用常规密钥的哈希插入。但是我在redis wiki中找不到关于多个get for hash键的任何信息。redis支持这种命令吗?

    谢谢您。

    5 回复  |  直到 9 年前
        1
  •  35
  •   kmerenkov    13 年前

    您可以查询哈希或管道中的任何键,即在对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

        2
  •  6
  •   rjp    13 年前

    如果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"
    
        3
  •  4
  •   Itamar Haber    9 年前

    MHGETALL 但你可以这样说:

    local r = {}
    for _, v in pairs(KEYS) do
      r[#r+1] = redis.call('HGETALL', v)
    end
    
    return r
    
        4
  •  0
  •   MyGGaN    9 年前

    雷迪斯有 HMGET 命令,它用一个命令返回多个哈希键的值。

        5
  •  -1
  •   Mikushi    13 年前

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