Redis Set gegen Hash

75

In vielen Redis-Tutorials (wie diesem ) werden Daten in einem Satz gespeichert, wobei jedoch mehrere Werte in einer Zeichenfolge zusammengefasst sind (dh ein Benutzerkonto kann im Satz als zwei Einträge gespeichert werden: "Benutzer: 1000: Benutzername" und "Benutzer: 1000: Passwort").

Redis hat jedoch auch Hashes. Es scheint sinnvoller zu sein, einen Hash "user: 1000" zu haben, der einen Eintrag "Benutzername" und einen Eintrag "Passwort" enthält. Anstatt Zeichenfolgen zu verketten, um auf einen bestimmten Wert zuzugreifen, greifen Sie einfach direkt im Hash darauf zu.

Warum wird es nicht so oft verwendet? Sind das nur alte Tutorials? Oder haben Redis-Hashes Leistungsprobleme?

Nairou
quelle
1
Ich denke, Sie beziehen sich auf den Befehl SET, der tatsächlich den Datentyp Strings verwendet. Es ist nur ein Schlüssel / Wert-Paar im Gegensatz zum tatsächlichen Datentyp "Sets" (der SADD verwendet, um das Set zu ergänzen).
Mike G
Sie haben Recht, es wird der Befehl SET verwendet. Ich wusste nicht, dass dies ein separater Datentyp ist, aber das macht Sinn.
Nairou
Ich weiß nichts über Leistungsunterschiede und schreibe einen kleinen Benchmark-Test. Github.com/logrusorgru/redisbm Aber verschiedene Hash-Parameter (wie die Anzahl der Felder) liefern ein anderes Ergebnis. Und set / get ist nicht immer langsamer.
Ivan Black

Antworten:

53

Redis-Hashes eignen sich gut zum Speichern komplexerer Daten, wie Sie in Ihrer Frage vorschlagen. Ich verwende sie genau dafür - um Objekte mit mehreren Attributen zu speichern, die zwischengespeichert werden müssen (insbesondere Inventardaten für ein bestimmtes Produkt auf einer E-Commerce-Website). Sicher, ich könnte eine verkettete Zeichenfolge verwenden - aber das erhöht die unnötige Komplexität meines Client-Codes, und ein Aktualisieren eines einzelnen Felds ist nicht möglich.

Sie haben vielleicht Recht - die Tutorials stammen möglicherweise einfach aus der Zeit vor der Einführung von Hashes. Sie wurden eindeutig zum Speichern von Objektdarstellungen entwickelt: http://oldblog.antirez.com/post/redis-weekly-update-1.html

Ich nehme an, ein Problem wäre die Anzahl der Befehle, die Redis ausführen muss, wenn ein neues Element eingefügt wird (n Anzahl der Befehle, wobei n die Anzahl der Felder im Hash ist), verglichen mit einem einfachen String SET-Befehl. Ich habe noch kein Problem bei einem Dienst festgestellt, der Redis ungefähr 1 Million Mal pro Tag trifft. Die Verwendung der richtigen Datenstruktur ist für mich wichtiger als eine vernachlässigbare Auswirkung auf die Leistung.

(Siehe auch meinen Kommentar zu Redis Sets vs. Redis Strings - Ich denke, Ihre Frage bezieht sich auf Strings, aber korrigieren Sie mich, wenn ich falsch liege!)

Mike G.
quelle
1
Hallo Mike, zwei Fragen. Erstens entspricht 1 Million Treffer pro Tag etwa 12 Anforderungen / s, was beim Redis-Benchmark 30.000 auf einem Low-End-EC2-Computer oder 120.000 auf einem High-End-Laptop ergibt. Wie wäre es mit mehr als 12 Mal pro Sekunde? Denken Sie, wenn Sie einige Tausend pro Sekunde haben, ist SET die bessere Wahl als HASH? Die zweite Frage bezieht sich auf das, was Sie gesagt haben "n Anzahl von Befehlen, wobei n die Anzahl von Feldern im Hash ist". Wenn Sie ein Element mit zwei Parametern speichern müssen, wird es zweimal gesetzt, um es separat wie Hash zu speichern macht das gleiche. Bist du sicher, dass HASH die Redis so viele wie seine Felder trifft? tnx
Maziyar
45

Hashes sind eine der effizientesten Methoden zum Speichern von Daten in Redis und empfehlen sie sogar, wann immer dies effektiv möglich ist.

http://redis.io/topics/memory-optimization

Verwenden Sie nach Möglichkeit Hashes

Kleine Hashes werden auf sehr kleinem Raum codiert. Sie sollten daher versuchen, Ihre Daten jedes Mal mit Hashes darzustellen, wenn dies möglich ist. Wenn Sie beispielsweise Objekte haben, die Benutzer in einer Webanwendung darstellen, verwenden Sie einen einzigen Hash mit allen erforderlichen Feldern, anstatt unterschiedliche Schlüssel für Vor- und Nachname, E-Mail-Adresse und Kennwort zu verwenden.

Dan Gayle
quelle
0

Anwendungsfallvergleich:

Sets bieten eine semantische Schnittstelle zum Speichern von Daten als Set auf dem Redis-Server. Die Anwendungsfälle für diese Art von Daten dienen eher Analysezwecken, z. B. wie viele Personen auf der Produktseite surfen und wie viele das Produkt am Ende kaufen.

Hashes bieten eine semantische Schnittstelle zum Speichern einfacher und komplexer Datenobjekte auf dem Redis-Server. Zum Beispiel Benutzerprofil, Produktkatalog usw.

Ref: Redis lernen

Mohammad Akbari
quelle