2012-07-13 12 views
25

Ich verwende Hashschlüssel Benutzerdaten zu speichern, wie:Wie in Redis für Hash-Schlüssel suchen?

hmset user:1 user_name lee age 21 
hmset user:2 user_name david age 25 
hmset user:3 user_name chris age 25 

Ich brauche für Benutzer age = 25 suchen zu müssen, name = lee. Wie wird nach einem bestimmten Wert in einem bestimmten Feld gesucht?

+0

Eine kürzlich hinzugefügte Seite in Redis 'Dokumentation bietet weitere Informationen über [Sekundäre Indizierung mit Redis] (http://redis.io/topics/indexes) und deckt diesen Fall unter den [Non-Range-Indizes] (http : //redis.io/topics/indexes#non-range-indexes) Abschnitt. –

Antwort

47

Sie können nicht. Redis ist ein Schlüsselwertspeicher, keine relationale Datenbank.

Um nach bestimmten Daten zu suchen, müssen Sie einen Zugriffspfad zu diesen Daten erstellen. Um beispielsweise die Benutzer mit Alter = 25 zu erhalten, müssen Sie einen Index erstellen, um die Alterswerte den Benutzern zuzuordnen. Es kann mit einem Set gemacht werden. Dies gilt auch für den Namen.

Sobald Sie für Alter und Name festgelegt haben, können Sie Benutzer durchsuchen, indem Sie die Sets schneiden. Zum Beispiel:

# Add 3 users 
hmset user:1 user_name lee age 21 
hmset user:2 user_name david age 25 
hmset user:3 user_name chris age 25 

# Maintain age index 
sadd age:21 1 
sadd age:25 2 3 

# Maintain name index 
sadd name:lee 1 
sadd name:david 2 
sadd name:chris 3 

# Get the ID of users having age = 25 and name = lee 
sinter age:25 name:lee 
    -> will return an empty set 
+0

Ich habe das gleiche Design Problem, aber meine Frage ist nach dem Befehl "Sinter Alter: 25 Name: Lee", sollte das Ergebnis Liste der ID sein. Also muss ich das zweite Mal abfragen, um die echten Benutzerdaten zu erhalten. Ist das der einzige Weg zu tun? –

+4

Wenn Sie eine einzelne Roundtrip durchführen möchten, wird ein serverseitiges Lua-Skript tun, was Sie wollen (d. H. Sinter, und dann ein hgetall pro ausgewähltem Element). –

+0

Es macht keinen Sinn, den HASH selbst zu verwalten, weil Sie bereits den umgekehrten Index für alle HASH-Felder gespeichert haben. – droidlabour

2

acually können Sie tun es mit aufgesetzten Werte in Schlüssel

HMSET lee:25 user_name lee age 25 
HMSET massi:43 user_name massi age 43 
HMSET lee:24 user_name lee age 24 
HMSET lee:28 user_name lee age 28 city Berlin 

Jetzt können Sie sie mit "Schlüssel" Befehl

127.0.0.1:6379> keys *:25 
1) "lee:25" 
127.0.0.1:6379> keys lee* 
1) "lee:25" 
2) "lee:24" 
3) "lee:28" 
127.0.0.1:6379> keys massi:43 
1) "massi:43" 

Schließlich finden spezifische Hashes

finden
127.0.0.1:6379> HGETALL lee:24 
1) "user_name" 
2) "lee" 
3) "age" 
4) "24" 

Alles, was ich sagte, ist tha t Sie können es in zwei Schritten tun, setzen Sie eine beliebige Anzahl von Werten, die Sie in Schlüssel benötigen, dann finden Sie sie. Aber bedenken Sie, dass es keine gute Idee ist, alle Werte in den Schlüssel zu setzen. Stellen Sie einfach diejenigen ein, mit denen Sie filtern müssen. Prost :)

+0

Während dies funktionieren könnte, würde ich wirklich empfehlen, dagegen etwas Ernstes zu bauen. In den Redis-Dokumenten gibt es eine spezielle Warnung gegen die Verwendung des KEYS-Befehls in einer Produktionsumgebung, da dies die Leistung in einer großen Datenbank beeinträchtigen kann: https://redis.io/commands/keys. – xiy