Wykonanie pętli na elementach i synchroniczny dostęp do każdego elementu nie jest zbyt wydajne. W przypadku Redis 2.4 istnieją różne sposoby robienia tego, co chcesz:
- za pomocą polecenia sort
- za pomocą potoku
- za pomocą poleceń parametrów zmiennych
W Redis 2.6 możesz również używać skryptów Lua, ale nie jest to tutaj naprawdę wymagane.
Nawiasem mówiąc, opisaną przez Ciebie strukturę danych można poprawić za pomocą skrótów. Zamiast przechowywać dane użytkownika w oddzielnych kluczach, możesz zgrupować je w obiekcie hash.
Korzystanie z polecenia sortowania
Możesz użyć polecenia sortowania Redis, aby pobrać dane w jednej podróży w obie strony.
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"
Korzystanie z potoku
Klient Ruby obsługuje potokowanie (tj. możliwość wysyłania kilku zapytań do Redis i oczekiwania na kilka odpowiedzi).
keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
keys.each do |x|
$redis.mget(x+":name",x+":age")
end
end
Powyższy kod pobierze dane tylko w dwóch rundach.
Korzystanie z polecenia parametru zmiennego
Polecenia MGET można użyć do pobrania kilku danych w jednym ujęciu:
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"
Koszt tutaj to również dwie podróże w obie strony. Działa to, jeśli możesz zagwarantować, że liczba kluczy do pobrania jest ograniczona. Jeśli nie, znacznie lepszym rozwiązaniem jest potokowanie.