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

Получение нескольких ключевых значений из Redis

В настоящее время я играю с Redis, и у меня есть несколько вопросов. Можно ли получить значения из массива ключей?

Пример:

users:1:name "daniel"
users:1:age  "24"

users:2:name "user2"
users:2:age  "24"

events:1:attendees "users:1", "users:2"

Когда я redis.get events:1:attendees, он возвращает "users:1", "users:2". Я могу пройти через этот список и получить пользователей: 1, получить пользователей: 2. Но это кажется неправильным, есть ли способ получить информацию о всех посетителях на странице 1??

В rails я бы сделал что-то вроде этого:

@event.attendees.each do |att|
  att.name
end

Но в redis я не могу, потому что он возвращает ключи, а не фактический объект, хранящийся на этом ключе.

спасибо:)

4b9b3361

Ответ 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"

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

Ответ 2

Вы можете использовать команду Redis EVAL, чтобы отправить ее Lua script, который запускает цикл "серверная сторона" и возвращает результаты в блоке.