2012-04-14 10 views
22

Ich spiele gerade mit Redis herum und ich habe ein paar Fragen. Ist es möglich, Werte aus einem Array von Schlüsseln zu erhalten?Mehrere Schlüsselwerte von Redis bekommen

Beispiel:

users:1:name "daniel" 
users:1:age "24" 

users:2:name "user2" 
users:2:age "24" 

events:1:attendees "users:1", "users:2" 

Wenn ich redis.get events:1:attendees es "users:1", "users:2" zurückgibt. Ich kann diese Liste durchlaufen und Benutzer erhalten: 1, erhalten Benutzer: 2. Aber das fühlt sich falsch an, gibt es eine Möglichkeit, alle Teilnehmerinformationen auf 1 zu bekommen ?!

In Schienen würde ich so etwas tun:

@event.attendees.each do |att| 
    att.name 
end 

Aber in redis kann ich nicht, weil es die Schlüssel zurückgibt und nicht das eigentliche Objekt zu diesem Schlüssel gespeichert.

Dank :)

Antwort

38

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.

+0

Danke für die Antwort! Ich werde deinen vorgeschlagenen Code ausprobieren! Danke :) –

+0

Dank @Didier, immer gut, neue Dinge zu lernen! –

5

Sie Redis' EVAL Befehl verwenden, kann es eine Lua script zu senden, die eine Schleife ‚Server-Seite‘ läuft und die Ergebnisse in einem Block zurück.

Verwandte Themen