Att göra en loop på föremålen och synkronisera varje element är inte särskilt effektivt. Med Redis 2.4 finns det olika sätt att göra vad du vill:
- genom att använda sorteringskommandot
- genom att använda pipelining
- genom att använda variadic parameterkommandon
Med Redis 2.6 kan du också använda Lua-skript, men detta krävs egentligen inte här.
Förresten, datastrukturen du beskrev skulle kunna förbättras genom att använda hash. Istället för att lagra användardata i separata nycklar, kan du gruppera dem i ett hash-objekt.
Använda sorteringskommandot
Du kan använda Redis sorteringskommandot för att hämta data på en tur och retur.
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"
Använda pipelining
Ruby-klienten stödjer pipelining (dvs möjligheten att skicka flera frågor till Redis och vänta på flera svar).
keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
keys.each do |x|
$redis.mget(x+":name",x+":age")
end
end
Ovanstående kod kommer endast att hämta data i två tur-och-returturer.
Använda variadic parameterkommando
MGET-kommandot kan användas för att hämta flera data på en gång:
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"
Kostnaden här är också två tur och retur. Detta fungerar om du kan garantera att antalet nycklar att hämta är begränsat. Om inte är pipelining en mycket bättre lösning.