2016-07-19 10 views
1

Ich versuche, einige Daten in redis zu speichern.Redis Schlüssel effizient erstellen

Betrachten Sie folgendes Beispiel.

Eine Person hat verschiedene Autos in verschiedenen Jahren im Besitz.

Zur Zeit bin ich zu speichern Tasten wie diese -

cars:johndoe:1991:mercedes model s1 engine v1 
cars:johndoe:1992:mercedes model s1 engine v1 
cars:jane:1992:BMW model s2 engine v2 
cars:foobar:1991:honda model s3 engine v3 

Vorteil davon ist, dass - ich Wildcard mit Schlüssel verwenden, können verschiedene Daten zu holen. z

1. all cars bought in 1991 
keys cars:*:1991:* 

2. all cars owned by johndoe 
keys cars:johndoe:* 

usw.

Aber wie pro redis Dokumentation, keys Befehl mit Wildcard ist nicht effizient, da es alle Schlüssel sucht.
Also entschied ich mich, Sets für diese Daten zu verwenden. Aber zu gleichen Ergebnisse wie oben zu erzielen, muss ich viele verschiedene Arten benötigen setzt beispiels

1. sadd cars cars:johndoe:1991:mercedes cars:johndoe:1992:mercedes cars:jane:1992:BMW cars:foobar:1991:honda 
2. sadd cars:johndoe cars:johndoe:1991:mercedes cars:johndoe:1992:mercedes 
3. sadd cars:jane cars:jane:1992:BMW 
4. sadd cars:foobar cars:foobar:1991:honda 
5. sadd cars:1991 cars cars:johndoe:1991:mercedes cars:foobar:1991:honda 

Auf diese Weise muss ich & entfernen viele Schlüssel für einzelne Operation hinzuzufügen.

Ist das der einzige Weg? Bitte lassen Sie mich wissen, ob es dafür eine effizientere Lösung gibt.

Vielen Dank im Voraus.

+1

Für diese Art von Operationen würde ich MongoDB verwenden. –

+0

@BhushanPatil danke für den Kommentar. Aber ich suche auch nach einem guten Cache mit weniger leistungsfähiger Maschine. – irc

Antwort

0

Bei der ersten Methode anstelle von Tasten verwenden, können Sie SCAN

verwenden Sie können ein einfaches lua Skript schreiben oder sogar in Ihrer App-Logik können Sie mit dem Cursor Punkt über den Scan-Befehl durchlaufen und alle Schlüssel bekommen passende das gegebene Muster.

IMO, wenn Sie viele Kriterien behandelt werden müssen, dann wäre der 1. Option die beste Lösung

  1. Sie vermeiden können mehrere sadds
  2. basierend auf irgendwelchen Bedingungen Retrieve schlagen

Wenn Sie haben weniger Anzahl der Kriterien die 2. Option wäre die beste Lösung

  1. Keine Notwendigkeit, Wit zu Iterieren h Scan-Befehl, Sie werden die Schlüssel haben, um bereit zu suchen.

Hoffe, das hilft.

+0

Ich benutze verdreht, nicht sicher, wie es geht, werde ich sicher versuchen. Upvoted Ihre Antwort, aber es wird möglicherweise nicht angezeigt, aufgrund meiner niedrigen Ruf. Vielen Dank für Informationen. – irc

0

Dies sind in der Tat die einzigen beiden Ansätze - nicht nur für Redis, sondern auch für jede andere Datenbank. Es ist der klassische Raum-Zeit-Kompromiss: entweder mit RAM bezahlen (d. H. Mehrere Indizes speichern [Sets]), um die Suche schnell zu machen, oder CPU verwenden (d. H. Einen Ad-hoc-Scan durchführen).

Die Philosophie von Redis ist die Nutzung von Räumen, weil unser Ziel die Maximierung der Leistung ist. Das bedeutet, dass Sie Ihre Daten so speichern möchten, wie Sie sie benötigen. Da Sie in Ihrem Fall daran interessiert sind, die Daten mit verschiedenen Dimensionen zu lesen, müssen Sie jede dieser Dimensionen entsprechend indizieren.Redis 'Sets sind eine gute Wahl für diese Art von Index, mit Ausnahme des "make year" -Datums, das davon profitieren könnte, in einem sortierten Set indiziert zu werden, um die Bereichssuche zu erleichtern (über Jahre, aber nur bei Bedarf).

+0

Danke für die Antwort. – irc

Verwandte Themen