Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Portierung von SQLite nach Redis

Ich denke, der beste Rat ist, sich nicht an das relationale Modell zu halten, wenn man etwas von einem RDBMS zu Redis portiert. Und über das Modell hinaus besteht ein wichtiger Unterschied darin, sich sowohl auf die Datenzugriffspfade als auch auf die Datenstrukturen zu konzentrieren.

Redis enthält keine Abfragesprache (sondern Befehle à la memcached) und kann daher nicht auf beliebige Abfragen antworten. Wenn ein Zugriffspfad zu den Daten nicht Teil der Datenstruktur ist, können die Daten nicht effizient abgerufen werden.

Redis ist nicht der beste NoSQL-Speicher, wenn es darum geht, beliebige Abfragen zu unterstützen. Zum Beispiel wären Sie mit etwas wie MongoDB besser bedient.

Nun, wenn Sie Ihre Sachen wirklich mit Redis implementieren wollen, könnten Sie versuchen, eine Strategie zu verwenden, die den Tagging-Engines ähnelt. Ihre Aufzeichnungen können in Hash-Objekten gespeichert werden. Für jeden Spaltenteil der willkürlichen Abfragen, die Sie unterstützen müssen, erstellen Sie Reverse-Indizes unter Verwendung von Sätzen.

Zum Beispiel:

# Set up the records: one hash object per record
hmset user:1 name Bilbo type Hobbit job None
hmset user:2 name Frodo type Hobbit job None
hmset user:3 name Gandalf type Maiar job Wizard
hmset user:4 name Aragorn type Human job King
hmset user:5 name Boromir type Human job Warrior

# Set up the indexes: one set per value per field
sadd name:Bilbo 1
sadd name:Frodo 2
sadd name:Gandalf 3
sadd name:Aragorn 4
sadd name:Boromir 5
sadd type:Hobbit 1 2
sadd type:Maiar 3
sadd type:Human 4 5
sadd job:None 1 2
sadd job:Wizard 3
sadd job:King 4
sadd job:Warrior 5

# Perform a query: we want the humans who happen to be a king
# We just have to calculate the intersection of the corresponding sets
sinterstore tmp type:Human job:King
sort tmp by nosort get user:*->name get user:*->job get user:*->type
1) "Aragorn"
2) "King"
3) "Human"

Durch die Kombination von Vereinigung, Schnittmenge und Differenz können komplexere Abfragen implementiert werden. Für nicht diskrete Werte oder für bereichsbasierte Abfragen müssen geordnete Mengen (zset) verwendet werden (und können mit normalen Mengen kombiniert werden).

Diese Methode ist normalerweise ziemlich schnell, wenn die Werte diskriminant genug sind. Bitte beachten Sie, dass Sie nicht die Flexibilität eines RDBMS haben (keine regulären Ausdrücke, keine Suche mit Präfixen, Bereichsabfragen sind mühsam, usw.)