Ответ 1
Выполнение цикла по элементам и синхронный доступ к каждому элементу не очень эффективно. С Redis 2.4 существуют различные способы сделать то, что вы хотите:
- с помощью команды сортировки
- с помощью конвейерной обработки
- с помощью команд переменных параметров
С Redis 2.6 вы также можете использовать сценарии Lua, но здесь это не требуется.
Кстати, описанную структуру данных можно улучшить с помощью хэшей. Вместо хранения пользовательских данных в отдельных ключах вы можете группировать их в хэш-объект.
Использование команды сортировки
Вы можете использовать команду сортировки Redis для извлечения данных в одном обратном направлении.
redis> set users:1:name "daniel"
OK
redis> set users:1:age 24
OK
redis> set users:2:name "user2"
OK
redis> set users:2:age 24
OK
redis> sadd events:1:attendees users:1 users:2
(integer) 2
redis> sort events:1:attendees by nosort get *:name get *:age
1) "user2"
2) "24"
3) "daniel"
4) "24"
Использование конвейерной обработки
Консолидация поддержки клиента Ruby (т.е. возможность отправки нескольких запросов в Redis и ожидание нескольких ответов).
keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
keys.each do |x|
$redis.mget(x+":name",x+":age")
end
end
Вышеприведенный код будет извлекать данные только в двух раундах.
Использование команды переменных параметров
Команда MGET может использоваться для извлечения нескольких данных за один снимок:
redis> smembers events:1:attendees
1) "users:2"
2) "users:1"
redis> mget users:1:name users:1:age users:2:name users:2:age
1) "daniel"
2) "24"
3) "user2"
4) "24"
Стоимость здесь также двух раундов. Это работает, если вы можете гарантировать, что количество ключей для извлечения ограничено. Если нет, конвейерная обработка является гораздо лучшим решением.