Подтвердить что ты не робот

Есть ли аналоговый сигнал MGET для хэшей Redis?

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

Спасибо.

4b9b3361

Ответ 1

Вы можете запросить хэши или любые ключи в конвейере, то есть в одном запросе к вашему экземпляру redis. Фактическая реализация зависит от вашего клиента, но с redis-py это будет выглядеть так:

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

Клиент выдаст один запрос с тремя командами. Это тот же метод, который используется для одновременного добавления нескольких значений в набор.

Подробнее на http://redis.io/topics/pipelining

Ответ 2

Если SORT позволяет использовать несколько GET с синтаксисом → , и все ваши хэши имеют одинаковые поля, вы можете получить их в массовом ответе, поместив их имена в набор и отсортировав их.

  SORT names_of_hashes GET *->field1 *->field2 *->field3 *->etc

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

UPDATE: 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

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

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

return r

Ответ 4

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

Ответ 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();

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