2012-04-11 11 views
6

Ich frage mich, was die Vorteile der Verwendung von Benutzer-IDs waren, anstatt nur den eindeutigen Benutzernamen für die Schlüssel zu verwenden.Benutzername oder ID für Schlüssel in Redis

  • user: username => {Passwort: HASH, Alter: 45}
  • Benutzer: 0 => {username: Benutzername, Passwort: HASH, Alter: 45}

Beachten Sie, dass ich würde Benutzer nach Namen suchen wollen und daher einen zweiten Satz von Schlüsselwerten benötigen, um Benutzernamen mit IDs zu verknüpfen.

Da jeder Benutzername eindeutig ist und alphanumerisch sein muss, gibt es einen bestimmten Grund, warum es vorteilhaft sein könnte, das ID-System zu verwenden.

Der Hauptgrund, warum ich das frage, ist, weil ich hauptsächlich IDs verwendet habe, da sie die Suchzeiten in meiner Datenbank verringerten, besonders wenn die Datenbank in irgendeiner Weise normalisiert wurde. Aber Redis profitiert nicht von diesem Vorteil und so fragte ich mich, welche anderen Gründe es geben könnte, Benutzer-IDs anstatt nur die Benutzernamen zu verwenden.

Vielen Dank für jede Hilfe,

Pluckerpluck

P. S. Aufgrund der Art und Weise, wie Redis Hashes handhabt, bin ich sehr unsicher bezüglich der Speicherunterschiede zwischen den beiden Methoden, so dass Informationen darüber gut sein können, obwohl ich das später selbst ausprobieren kann.

Antwort

13

In dem von Ihnen definierten Anwendungsfall spielt es keine Rolle, aber die Verwendung ganzer Benutzer-IDs hat andere Vorteile.

Früher oder später möchten Sie Benutzer-IDs in anderen Objekten verweisen. Zum Beispiel "Freunde des Benutzers pluckerpluck". Zu modellieren, dass, würden Sie zwei Alternativen haben -

friendsof:pluckerpluck -> SET{tom, dick, harry}

VS

friendsof:1 --> SET{2, 3, 4}

Der frühere Ansatz verwendet eine regelmäßige Hash-Tabelle, die Elemente zu speichern, und verwendet viel Speicher. Der letztere Ansatz verwendet ein Integer-Array und ist äußerst speichereffizient.

Diese spezielle Kodierung für Mengen von ganzen Zahlen heißt IntSet. Sie können das Verhalten von Redis mit Hilfe der Eigenschaft set-max-intset-entries

# Sets have a special encoding in just one case: when a set is composed 
# of just strings that happens to be integers in radix 10 in the range 
# of 64 bit signed integers. 
# The following configuration setting sets the limit in the size of the 
# set in order to use this special memory saving encoding. 
set-max-intset-entries 512 
+0

steuern Danke, dass Sie dieses Szenario hervorgehoben haben. Nur eine kurze Frage: Wenn ich IDs verwenden würde. Ich würde dann einen Benutzernamen-ID-Beziehungen benötigen, um die Suche nach Benutzernamen zu ermöglichen. Denkst du, ein sortierter Satz (Rang ist die ID) wäre ein guter Weg, das zu tun? Oder stattdessen ein Hash? – Pluckerpluck

+2

Hash ist besser aus zwei Gründen - a) Es verwendet weniger Speicher als eine sortierte Menge, und b) Es gibt keine definierte Reihenfolge der Benutzer, so dass es konzeptionell keinen Sinn macht, eine sortierte Menge zu verwenden. –

+0

Ich würde einen Hash verwenden, um Benutzernamen zu indizieren. Sie sind viel kompakter als zset im Speicher. Die Verwendung eines Zsets wäre nur sinnvoll, wenn Sie Bereichsabfragen für Namen unterstützen müssten ... –

Verwandte Themen