Я планирую начать использовать хэши внутри обычных клавиш. Но я не могу найти информацию о том, как много get для хэш-ключей в вики Redis. Реддис поддерживает эту команду?Есть ли аналогом MGET для хэшей Redis?
спасибо.
Я планирую начать использовать хэши внутри обычных клавиш. Но я не могу найти информацию о том, как много get для хэш-ключей в вики Redis. Реддис поддерживает эту команду?Есть ли аналогом MGET для хэшей Redis?
спасибо.
Вы можете запросить хеши или любые ключи в конвейере, то есть в одном запросе к вашему экземпляру 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
Команда Redis имеет команду HMGET, которая возвращает значения нескольких хэш-ключей с помощью одной команды.
Да, но HMGET вернет несколько значений конкретных полей, но мне нужно вернуть целые хэши (например, HGETALL do http://code.google.com/p/redis/wiki/HgetallCommand). В любом случае, спасибо за ваш ответ. – Kirzilla
Bump! Что вы подразумеваете под целыми хэшами? С помощью 'HMGET' у вас есть все значения для запрошенных ключей, и поскольку у вас уже есть ключи, и каждый ключ имеет соответствующее значение в порядке, вы можете создать локальный хэш с каждой парой ключ/значение в вашем коде. Пожалуйста, объясни. Спасибо. – Niloct
Если хеш концептуально используется для хранения пользователя, тогда HMGET получит вам, например, имя пользователя и пароль одного пользователя с указанным идентификатором. Аналогичный метод, аналогичный MGET для хэшей, с учетом набора идентификаторов получает имена пользователей и пароли всех этих пользователей за один раз. В этом разница. – majelbstoat
Если 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"
Там нет команды, чтобы сделать это на один выстрел, но есть способ сделать это «красиво» , используя список (или отсортированный набор), в котором вы будете хранить ваши 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 используя отсортированный набор, где вы используете счет в качестве идентификатора для вашего хэша, что позволяет воспользоваться преимуществами всех команд забьет основе.
Нет MHGETALL
, но вы можете Lua его:
local r = {}
for _, v in pairs(KEYS) do
r[#r+1] = redis.call('HGETALL', v)
end
return r
Если ваш вопрос был дан ответ, пожалуйста, отметьте правильный ответ. Спасибо. – kmerenkov