Правенето на цикъл върху елементите и синхронният достъп до всеки елемент не е много ефективно. С 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"
Цената тук също е две двупосочни пътувания. Това работи, ако можете да гарантирате, че броят на ключовете за извличане е ограничен. Ако не, тръбопровода е много по-добро решение.