Есть ли аналог MGET для хэшей Redis? - PullRequest
34 голосов
/ 25 июля 2010

Я планирую начать использовать хэши вместо обычных ключей. Но я не могу найти какую-либо информацию о multi get для хэш-ключей в вики Redis. Эта команда поддерживается Redis?

Спасибо.

Ответы [ 5 ]

37 голосов
/ 08 февраля 2011

Вы можете запрашивать хэши или любые ключи в конвейере, то есть одним запросом к вашему экземпляру 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

6 голосов
/ 03 декабря 2010

Если 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"
5 голосов
/ 11 марта 2015

Нет MHGETALL но вы можете Lua это:

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

return r
0 голосов
/ 19 января 2011

Нет команды сделать это за один снимок, но есть способ сделать это «красиво», используя список (или отсортированный набор), в котором вы будете хранить ваши hashKeys, а затем извлекать их как массив, используя 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();

Я рекомендую использовать отсортированный набор, где вы используете счет в качестве идентификатора для своего хэша, он позволяет использовать преимущества всех команд, основанных на оценке.

0 голосов
/ 10 августа 2010

Redis имеет команду HMGET , которая возвращает значения нескольких хеш-ключей одной командой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...