web-dev-qa-db-ja.com

RedisハッシュのMGETアナログはありますか?

通常のキーの代わりにハッシュを使い始める予定です。しかし、Redis wikiでハッシュキーのマルチゲットに関する情報を見つけることができません。この種のコマンドはRedisでサポートされていますか?

ありがとうございました。

39
Kirzilla

パイプラインで、つまりredisインスタンスへの1つのリクエストで、ハッシュまたは任意のキーをクエリできます。実際の実装はクライアントによって異なりますが、redis-pyでは次のようになります。

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

クライアントは、3つのコマンドで1つの要求を発行します。これは、一度に複数の値をセットに追加するために使用される手法と同じです。

詳しくは http://redis.io/topics/pipelining をご覧ください

40
kmerenkov

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"
8
rjp

いいえMHGETALLですが、Luaでできます:

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

return r
7
Itamar Haber

Redisには [〜#〜] hmget [〜#〜] コマンドがあり、1つのコマンドで複数のハッシュキーの値を返します。

0
Fabian Jakobs