2010-07-25 4 views
29

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

спасибо.

+0

Если ваш вопрос был дан ответ, пожалуйста, отметьте правильный ответ. Спасибо. – kmerenkov

ответ

31

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

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

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

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

2

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

+1

Да, но HMGET вернет несколько значений конкретных полей, но мне нужно вернуть целые хэши (например, HGETALL do http://code.google.com/p/redis/wiki/HgetallCommand). В любом случае, спасибо за ваш ответ. – Kirzilla

+1

Bump! Что вы подразумеваете под целыми хэшами? С помощью 'HMGET' у вас есть все значения для запрошенных ключей, и поскольку у вас уже есть ключи, и каждый ключ имеет соответствующее значение в порядке, вы можете создать локальный хэш с каждой парой ключ/значение в вашем коде. Пожалуйста, объясни. Спасибо. – Niloct

+4

Если хеш концептуально используется для хранения пользователя, тогда HMGET получит вам, например, имя пользователя и пароль одного пользователя с указанным идентификатором. Аналогичный метод, аналогичный MGET для хэшей, с учетом набора идентификаторов получает имена пользователей и пароли всех этих пользователей за один раз. В этом разница. – majelbstoat

6

Если 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" 
0

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

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

3

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

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

return r