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

Benötigen Sie Hilfe bei der Konzeption in Redis/NoSQL

Sie haben Recht, dass mit Redis nur einfache Datenstrukturen verfügbar sind und sie nicht nach Wert zusammengesetzt werden können (wie Sie es mit einer dokumentenorientierten Datenbank wie CouchDB oder MongoDB tun könnten). Es ist jedoch möglich, Datenstrukturen durch Referenz zusammenzustellen, und dies ist ein sehr verbreitetes Muster.

Beispielsweise können die in einer Menge enthaltenen Elemente die Schlüssel für andere Objekte sein (Listen, Hash-Tabellen, andere Mengen usw.). Lassen Sie uns versuchen, dies auf Ihr Beispiel anzuwenden.

Um eine Beziehung zwischen Kunden und Gerät+Port zu modellieren, können Sie Sets verwenden, die Kunden-IDs enthalten. Um Informationen über die Kunden zu speichern, ist eine Hash-Tabelle pro Kunde in Ordnung.

Hier sind die Kunden:

hmset c:1 name Smith protocol tcp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:2 name Jackson protocol udp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:3 name Davis protocol tcp snmp_dest 127.0.0.3 syslog_dest 127.0.0.4

Die Schlüssel dieser Datensätze sind c:ID

Lassen Sie uns zwei davon einem Gerät und Port zuordnen:

sadd d:Los_Angeles:11 2 3

Der Schlüssel dieses Satzes ist d:device:port. Die Präfixe c:und d:sind nur eine Konvention. Pro Gerät/Port sollte ein Satz erstellt werden. Ein bestimmter Kunde könnte zu mehreren Sets gehören (und daher mehreren Geräten/Ports zugeordnet sein).

Um nun die Kunden mit an dieses Gerät/Port angeschlossenen Zustellungsmethoden zu finden, müssen wir nur noch den Inhalt des Sets abrufen.

smembers d:Los_Angeles:11
1) "2"
2) "3"

dann können die entsprechenden Kundeninformationen durch Pipelining einer Reihe von hgetall-Befehlen abgerufen werden:

hgetall c:2
hgetall c:3
1) "name"
2) "Jackson"
3) "protocol"
4) "udp"
5) "snmp_dest"
6) "127.0.0.1"
7) "syslog_dest"
8) "127.0.0.2"
1) "name"
2) "Davis"
3) "protocol"
4) "tcp"
5) "snmp_dest"
6) "127.0.0.3"
7) "syslog_dest"
8) "127.0.0.4"

Haben Sie keine Angst vor der Anzahl der Befehle. Sie sind sehr schnell und die meisten Redis-Clients haben die Fähigkeit, die Abfragen zu leiten, sodass nur eine minimale Anzahl von Roundtrips erforderlich ist. Durch die Verwendung von nur einem smember und mehreren hgetall kann das Problem mit nur zwei Roundtrips gelöst werden.

Dank des allgegenwärtigen SORT-Befehls ist es jetzt möglich, noch etwas weiter zu optimieren. Dies ist wahrscheinlich der komplexeste Befehl in Redis und kann verwendet werden, um hier einen Roundtrip zu sparen.

sort d:Los_Angeles:11 by nosort get c:*->name get c:*->protocol get c:*->snmp_dest get c:*->syslog_dest
1) "Jackson"
2) "udp"
3) "127.0.0.1"
4) "127.0.0.2"
5) "Davis"
6) "tcp"
7) "127.0.0.3"
8) "127.0.0.4"

In einem Befehl ruft es den Inhalt eines Geräte-/Port-Sets ab und ruft die entsprechenden Kundeninformationen ab.

Dieses Beispiel war trivial, aber allgemeiner, obwohl Sie komplexe Datenstrukturen mit Redis darstellen können, ist es nicht unmittelbar. Sie müssen sowohl hinsichtlich der Struktur als auch des Datenzugriffs sorgfältig über das Modell nachdenken (d. h. halten Sie sich während der Entwurfszeit an Ihre Daten UND Ihre Anwendungsfälle).