2015-07-21 2 views
1

Есть ли способ иметь следующее в 1-запросу 1-ответ?Труба Редиса как атомная

дали Redis набор с именем ключа и для каждого ключа имеет REDIS хэш с полями

Как я могу извлечь хэши этих ключей в один присест?

что-то подобное, что это лучшее, что можно сделать (не уверен, что это будет работать, но вы получите идею)

hashes = [] 
keys = redis.smembers("myset") 
redis.multi do 
    keys.map do |k| 
    hashes << redis.hgetall(k) 
    end 
end 
hashes = hash.map(&:value) # to resolve future values 

, но это делает по крайней мере два запроса (который не является лучшим, но ok), не знаете, как Redis :: Future решает оценить (если он отправляет другой запрос или нет)

ответ

2

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

Вы можете попытаться написать сценарий Lua, который сделает все это в Redis и вернет комбинированные результаты. См. Документацию EVAL command для ознакомления с скриптами в Redis. Обратите внимание: если вы это сделаете, вы не сможете использовать кластер, так как ключи должны быть явно предоставлены сценарию, чтобы он был безопасным в кластере.


* MGET делает возвращаемые значения для нескольких ключей, но только если они ниточки.

+0

Я должен был понять, что использование multi делает все внутри в одном сетевом запросе, нет? –

+0

'MULTI' - это начало транзакции - он позволяет вам совершать или откатывать все изменения сразу, но они все равно выполняются как отдельные вызовы Redis. – jmruc

+1

Действительно, хотя генерация имен ключей или их чтение из БД (например, 'smembers') противоречит рекомендации использовать аргумент массива' KEYS 'для сценария Lua и будет проблематичным для запуска в кластерном кластере –

Смежные вопросы