Eine Schleife auf den Elementen und synchroner Zugriff auf jedes Element ist nicht sehr effizient. Mit Redis 2.4, gibt es verschiedene Möglichkeiten, zu tun, was Sie wollen:
- durch den Sortier Befehl
- von Pipelining mit
- von variadische Parameter-Befehlen
mit Redis 2.6, Sie kann auch Lua Scripting verwenden, aber das ist hier nicht wirklich erforderlich.
Übrigens könnte die Datenstruktur, die Sie beschrieben haben, durch die Verwendung von Hashes verbessert werden. Anstatt Benutzerdaten in separaten Schlüsseln zu speichern, könnten Sie sie in einem Hash-Objekt gruppieren.
Mit dem Befehl sort
Sie können die Redis Art Befehl verwenden, um die Daten in einer Hin- und Rück 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"
Pipelining Verwendung
Die Rubin-Client-Unterstützung Pipelining (das heißt die Fähigkeit für mehrere Antworten mehrere Abfragen an Redis und warten zu senden). nur
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 wird die Daten in zwei Hin- und Rückflüge abrufen.
Mit variadische Parameter Befehl
Der MGET Befehl verwendet werden, können mehrere Daten in einem Schuss 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 hier ist auch zwei Hin- und Rückflüge. 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.
Danke für die Antwort! Ich werde deinen vorgeschlagenen Code ausprobieren! Danke :) –
Dank @Didier, immer gut, neue Dinge zu lernen! –