At lave en løkke på emnerne og synkront få adgang til hvert element er ikke særlig effektivt. Med Redis 2.4 er der forskellige måder at gøre, hvad du vil:
- ved at bruge sorteringskommandoen
- ved at bruge pipelining
- ved at bruge variadiske parameterkommandoer
Med Redis 2.6 kan du også bruge Lua-scripting, men det er egentlig ikke påkrævet her.
I øvrigt kunne den datastruktur, du beskrev, forbedres ved at bruge hashes. I stedet for at gemme brugerdata i separate nøgler, kan du gruppere dem i et hash-objekt.
Brug af sorteringskommandoen
Du kan bruge Redis sorteringskommandoen til at hente dataene på én rundtur.
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"
Brug af pipelining
Ruby-klienten understøtter pipelining (dvs. evnen til at sende flere forespørgsler til Redis og vente på flere svar).
keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
keys.each do |x|
$redis.mget(x+":name",x+":age")
end
end
Ovenstående kode vil kun hente data i to rundrejser.
Brug af variadisk parameterkommando
MGET-kommandoen kan bruges til at hente flere data i ét skud:
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"
Prisen her er også to returflyvninger. Dette virker, hvis du kan garantere, at antallet af nøgler, der skal hentes, er begrænset. Hvis ikke, er pipelining en meget bedre løsning.