Das Ausführen einer Schleife für die Elemente und der synchrone Zugriff auf jedes Element ist nicht sehr effizient. Mit Redis 2.4 gibt es verschiedene Möglichkeiten, das zu tun, was Sie wollen:
- mithilfe des Sortierbefehls
- durch Verwendung von Pipelining
- durch Verwendung verschiedener Parameterbefehle
Mit Redis 2.6 können Sie auch Lua-Scripting verwenden, aber das ist hier nicht wirklich erforderlich.
Übrigens könnte die von Ihnen beschriebene Datenstruktur durch die Verwendung von Hashes verbessert werden. Anstatt Benutzerdaten in separaten Schlüsseln zu speichern, könnten Sie sie in einem Hash-Objekt gruppieren.
Verwendung des Sortierbefehls
Sie können den Redis-Sortierungsbefehl verwenden, um die Daten in einem Roundtrip abzurufen.
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"
Verwenden von Pipelining
Der Ruby-Client unterstützt Pipelining (d. h. die Fähigkeit, mehrere Abfragen an Redis zu senden und auf mehrere Antworten zu warten).
keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
keys.each do |x|
$redis.mget(x+":name",x+":age")
end
end
Der obige Code ruft die Daten nur in zwei Roundtrips ab.
Variadic-Parameterbefehl verwenden
Der MGET-Befehl kann verwendet werden, um mehrere Daten auf einmal abzurufen:
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"
Die Kosten betragen auch hier zwei Hin- und Rückfahrten. Dies funktioniert, wenn Sie garantieren können, dass die Anzahl der abzurufenden Schlüssel begrenzt ist. Wenn nicht, ist Pipelining eine viel bessere Lösung.