Redis Key Namenskonventionen?

226

Was ist die normale Namenskonvention für Schlüssel in Redis? Ich habe Werte gesehen, die durch getrennt sind :, bin mir aber nicht sicher, was die normale Konvention ist oder warum.

Für einen Benutzer würden Sie so etwas wie ...

user:00

wenn die Benutzer-ID war 00

Können Sie nur den Anfang des Schlüssels abfragen, um alle Benutzer zurückzugeben?

Ich hoffe hauptsächlich, zukünftige Probleme zu vermeiden, indem ich untersuche, wie Menschen arbeiten und warum sie sie ausgewählt haben.

schick
quelle

Antworten:

205

Was ist die normale Namenskonvention für Schlüssel in Redis? Ich habe Werte gesehen, die durch Folgendes getrennt sind: Ich bin mir jedoch nicht sicher, was die normale Konvention ist oder warum.

Ja, das Doppelpunktzeichen :ist eine Konvention beim Benennen von Schlüsseln. In diesem Tutorial auf der redis-Website heißt es: Versuchen Sie, sich an ein Schema zu halten. Zum Beispiel kann "Objekttyp: ID: Feld" eine nette Idee sein, wie in "Benutzer: 1000: Passwort". Ich verwende gerne Punkte für Felder mit mehreren Wörtern, wie in "comment: 1234: reply.to".

Können Sie nur den Anfang des Schlüssels abfragen, um alle Benutzer zurückzugeben?

Wenn Sie so etwas wie die direkte Abfrage aller Schlüssel meinen, die damit beginnt, user:gibt es dafür einen Schlüsselbefehl . Dieser Befehl sollte jedoch nur zu Debugging-Zwecken verwendet werden, da er O (N) ist, da er alle in der Datenbank gespeicherten Schlüssel durchsucht.

Eine geeignetere Lösung für dieses Problem besteht darin, einen dedizierten Schlüssel zu erstellen users, der alle Benutzerschlüssel speichert, z. B. in einer Liste oder einer festgelegten Datenstruktur.

yojimbo87
quelle
1
scanist keine Option @EranH., es ist die beste Vorgehensweise, Schlüssel zu iterieren. scanwird verwendet, um eine Sammlung von Elementen schrittweise zu durchlaufen.
Kishor Pawar
2
@ yojimbo87 Es wird also zwei Befehle geben, zum einen zum Erstellen eines Schlüssels wie - user: 808021: password = XYZ und zum anderen zum Einfügen des Schlüssels in die Registrierung oder den Index (set), aber was passiert, wenn ein Befehl erfolgreich ausgeführt wird und andere werden fehlgeschlagen bedeutet, dass Schlüssel erstellt wurden, aber keinen Eintrag in der Registrierung erhalten.
LoveToCode
1
@LoveToCode Sie können eine Transaktion verwenden, die sicherstellen soll, dass entweder alle oder keine der Operationen ausgeführt werden.
Yojimbo87
2
Mir ist auch aufgefallen, dass Redis Desktop Manager (ein Redis-Client-Tool) auch Doppelpunkt ':' als Trennzeichen behandelt und mehrere Schlüssel gruppiert anzeigt
Adam Rotaru
1
Ich bin der Meinung, dass der einzigartige Wert zuletzt sein wird. Macht es einfach, etwas zu tun wie:$redis->delete($redis->keys('user:password:*'));
Buntstifte
26

Wir verwenden einen Doppelpunkt (:) als Namespace-Trennzeichen und einen Hash (#) für ID-Teile von Schlüsseln, z.

logistics:building#23
Der Nagel
quelle
Was ist die beste Namenskonvention, wenn Sie mehr Schlüssel wie Gebietsschema, Kategorie usw. haben? {resource}: {key} # {value}, {key} # {value} => Texte: Gebietsschema # en, Kategorie # 15? Oder haben Sie einen anderen Vorschlag?
Fsasvari
1
In meinem Beispiel ist "Gebäude" nur der Name der "Sammlung" und 23 die benutzerdefinierte "ID". Wenn Sie eine zusammengesetzte ID mit locale = en und category = 15 haben, könnte die tatsächliche ID {en, 15} sein, also Namespace: Texte # {en, 15} oder ausführlicher: Namespace: Texte # {Gebietsschema = en, Kategorie = 15}. Aber das ist nur eine Idee, ich habe sie noch nie so benutzt. Achten Sie darauf, die Reihenfolge der ID-Elemente nicht zu ändern, da der Schlüssel natürlich nicht gefunden wird. Anstatt eine solche Komplexität in Ihren Schlüsselnamen zu kodieren, sollten Sie stattdessen Redis-Datenstrukturen verwenden. Schauen Sie sich redis.io/topics/indexes an
The Nail
16

Eine Konvention scheint Doppelpunkt (:) zu sein, aber ich bin ein Webentwickler, daher bevorzuge ich persönlich einen Schrägstrich (/) für das Trennzeichen. Schrägstrich ist bereits ein so wichtiges Trennzeichen innerhalb von URLs, die als Uniform Resource Locators gedacht sind, also als Schlüssel für Ressourcen. Warum mit Doppelpunkt (:) einen anderen Ansatz wählen? Hilft es etwas?

Betrachten Sie dieses Beispiel:

Wir haben eine RESTful API für Spielzeugobjekte. Es gibt eine:

http://example.com/api/toy/234 

Wo haben wir es aufbewahrt? Wir verwenden Redis und Schrägstriche, damit der Schlüssel offensichtlich ist:

toy/234

Dies ist der einzigartige Schlüssel für das Spielzeug. Der Schlüssel kann jetzt auch clientseitig verwendet werden:

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

Ein Benutzer fordert ein Objekt mit Schlüssel an toy/666. Wie bekomme ich es von Redis? Ein Beispiel für Node.js:

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

Es ist nicht erforderlich, Schrägstriche in Doppelpunkte umzuwandeln und umgekehrt. Praktisch, meinst du nicht?

Hinweis: Stellen Sie immer sicher, dass der Benutzer nur auf die von Ihnen beabsichtigten Dinge zugreifen kann. Der oben beschriebene rohe URL-zu-Schlüssel-Ansatz kann ebenfalls abgerufen user/1/passwordwerden, wie von Kommentatoren festgestellt. Dies sollte kein Problem sein, wenn Sie Redis als öffentlichen schreibgeschützten Cache verwenden.

Akseli Palén
quelle
24
… Bequem und fast ekelhaft unsicher. Du bettelst darum, etwas zu bekommen curl http://example.com/api/user/1/passwordoder ähnliches. (Sag es einfach.)
ELLIOTTCABLE
3
Doppelpunkte, Hashes und Schrägstriche können verwendet werden, um verschiedene Verschachtelungsebenen zu kennzeichnen, z. B.User#23:uploads:my/path/to/file.ext
inkarniert
31
Bitte nehmen Sie niemals Benutzereingaben als Schlüssel in die Datenbank.
Lyle
1
Mir gefällt, wie Sie dachten, Sie bevorzugen Schrägstriche, weil Sie ein Webentwickler sind.
Hector Ordonez
@ELLIOTTCABLE Danke, Hinweis zu den Unsicherheiten hinzugefügt. Sehen Sie bei diesem Ansatz ein Problem, wenn Redis als öffentlicher schreibgeschützter Cache verwendet wird?
Akseli Palén
6

Ich weiß nicht, ob es wirklich noch weit verbreitete "Best Practices" für die Benennung von Redis-Schlüsseln gibt.

Ich habe mit der Verwendung von ASCII-NUL-Zeichen als Trennzeichen experimentiert (da Redis und Python beide 8-Bit-sauber sind). Es sieht ein wenig hässlich aus, wenn Sie sich rohe Schlüssel ansehen, aber die Idee ist, sie hinter einer Abstraktionsschicht zu verstecken. Doppelpunkt- und Pipe-Symbole sind offensichtliche Alternativen, solange die Komponenten Ihres Namensraums diese garantiert nicht verwenden oder Sie bereit sind, jede Komponente nach Bedarf zu codieren. Wenn Sie sie jedoch codieren möchten, möchten Sie die Abstraktionsschicht entwickeln und trotzdem vermeiden, Rohschlüssel anzuzeigen. Dies brachte mich dazu, in meinen Überlegungen nur \ 0 zu verwenden.

Es wird mich interessieren, ob andere Meinungen dazu geäußert werden.

Jim Dennis
quelle
0

Für Ihren Anwendungsfall scheint mir HSET / HGET besser zu passen. Es gibt auch den Befehl HKEYS .

Alle diese Befehle sind genauso komplex wie GET / SET / KEYS. Warum also nicht?

Sie könnten dann diese Struktur haben:

  • Benutzer> 00> Wert
  • Benutzer> 01> Wert

oder:

  • Benutzer: Benutzername> 00> Wert
  • Benutzer: Benutzername> 01> Wert

Extrahieren Sie einfach die Benutzer-ID und verwenden Sie sie als Hash-Schlüssel. Ich persönlich bevorzuge diesen Ansatz, da er sich besser anfühlt und Sie auch problemlos nach vorhandenen Benutzer-IDs fragen können.

in vitro
quelle