2013-04-25 7 views
90

Ich bin also an einen Ort gekommen, an dem ich die in redis gespeicherten Daten in separate Datenbanken segmentieren wollte, da ich manchmal den keys-Befehl für eine bestimmte Art von Daten verwenden und trennen wollte das schneller.Was ist der Sinn von mehreren Redis-Datenbanken?

Wenn ich in mehrere Datenbanken segmentiere, ist alles noch single-threaded, und ich kann immer noch nur einen Kern verwenden. Wenn ich eine weitere Instanz von Redis auf derselben Box starte, kann ich einen zusätzlichen Kern verwenden. Außerdem kann ich keine Redis-Datenbanken benennen oder ihnen irgendeinen logischen Bezeichner geben. Also, mit all dem gesagt, warum/wann würde ich jemals mehrere Redis-Datenbanken verwenden wollen, anstatt nur eine zusätzliche Instanz von Redis für jede zusätzliche Datenbank, die ich haben möchte, zu drehen? Und warum versucht Redis nicht, einen zusätzlichen Kern für jede zusätzliche Datenbank zu verwenden, die ich hinzufüge? Was ist der Vorteil von Single-Threading in Datenbanken?

+0

in Ihrer Node.js App, tun Sie dies ---> module.exports = {"1": "Ihr Name für redisd db one", "2": "Ihr Name für redis db two", " 3 ":" Ihr Name für redis db three "} usw., oder wechseln Sie die Schlüssel und Werte, was immer Sie brauchen –

+0

In Redis 2.8.0 und höher wird empfohlen, dass Sie SCAN anstelle von KEYS verwenden, weil es über eine kleine Zahl iteriert von Elementen gleichzeitig (wodurch der Server für längere Zeit nicht blockiert wird). – TryHarder

Antwort

49

Prinzipiell Redis Datenbanken auf derselben Instanz nicht anders sind als Schemata in RDBMS-Datenbank Instanzen.

Also, mit all dies gesagt wurde, warum/wann sollte ich jemals mehrere verwenden Redis-Datenbanken statt nur eine zusätzliche Instanz von Redis für jede zusätzliche Datenbank Spinnen bis ich will?

Es gibt einen klaren Vorteil von redis Datenbanken in derselben redis Instanz verwendet wird, und das ist Management. Wenn Sie für jede Anwendung eine separate Instanz erstellen, und sagen wir, Sie haben 3 Apps, sind das 3 separate Redis-Instanzen, von denen jede wahrscheinlich einen Slave für HA in der Produktion benötigt, also insgesamt 6 Instanzen. Aus der Sicht des Managements wird dies sehr schnell unordentlich, weil Sie alle überwachen müssen, Upgrades/Patches durchführen müssen usw. Wenn Sie Redis mit hohen I/O nicht überladen wollen, ist eine einzelne Instanz mit einem Slave einfacher und einfacher einfacher zu verwalten, sofern es Ihrem SLA entspricht.

+10

Mehrere Redis Instanzen ist immer der Weg zu gehen. Zeitraum. Führen Sie parallele Abfragen für verschiedene Daten aus. Wenn Ihre CICD-Pipeline keine Cache-Cluster für Sie erstellt, beheben Sie sie, anstatt ..... Sie erhalten den Punkt – Cmag

4
  1. Ich kenne keine Vorteile von mehreren Datenbanken in einer einzigen Instanz. Ich denke, es ist nützlich, wenn mehrere Dienste denselben Datenbankserver verwenden, sodass Sie Schlüsselkollisionen vermeiden können.

  2. Ich würde nicht empfehlen, mit dem Befehl KEYS herum zu bauen, da es O (n) ist und das nicht gut skaliert. Wofür verwenden Sie es, das können Sie auf andere Weise erreichen? Vielleicht ist redis nicht die beste Lösung für Sie, wenn Funktionalität wie KEYS entscheidend ist.

  3. Ich denke, sie erwähnen die Vorteile eines Single-Thread-Servers in ihren FAQ, aber die Hauptsache ist die Einfachheit - Sie müssen sich nicht wirklich um die Nebenläufigkeit kümmern. Jede Aktion blockiert, also können nicht zwei Dinge die Datenbank gleichzeitig ändern. Im Idealfall würden Sie pro Kern jedes Servers eine (oder mehrere) Instanzen haben und einen konsistenten Hash-Algorithmus (oder einen Proxy) verwenden, um die Schlüssel unter ihnen aufzuteilen. Natürlich werden Sie verlieren einige Funktionen - Rohrleitungen nur für Dinge auf demselben Server arbeiten, werden Sorten härter usw.

+0

Als Antwort auf die 2: Ich benutze den Tastenbefehl nur, wenn ich alle Schlüssel brauche. Ich benutze es genauso wie man hgetall verwenden würde. Beide sind O (n). Keys sind schlecht, wenn Sie eine große Menge von Schlüsseln für einige Regex durchsuchen müssen, aber es ist vollkommen in Ordnung, wenn Sie einige Operationen auf allen Schlüsseln in einigen db durchführen müssen. Als Antwort auf 3: Ich verstehe die Vorteile von Single Threading auf einer Datenbank.Ich verstehe es nicht in vielen Datenbanken, da eine Aktion in einer Datenbank niemals eine Aktion in einer anderen Datenbank AFAIK blockieren muss. – Eli

73

Sie möchten nicht mehrere Datenbanken in einer einzelnen Redis-Instanz verwenden. Es ist veraltet und, wie Sie bereits erwähnt haben, können Sie mit mehreren Instanzen die Vorteile mehrerer Kerne nutzen. Wenn Sie die Datenbankauswahl verwenden, müssen Sie beim Upgrade umgestalten. Das Überwachen und Verwalten mehrerer Instanzen ist weder schwierig noch schmerzhaft.

In der Tat, Sie würden viel bessere Metriken für jede db durch Segregation basierend auf Instanz erhalten. Jede Instanz würde Statistiken enthalten, die dieses Datensegment widerspiegeln, was eine bessere Abstimmung und eine reaktionsfähigere und genauere Überwachung ermöglichen kann. Verwenden Sie eine aktuelle Version und trennen Sie Ihre Daten nach Instanz.

Wie Jonaton sagte, verwenden Sie nicht den Befehl keys. Sie werden viel bessere Leistung finden, wenn Sie einfach einen Schlüsselindex erstellen. Wenn Sie einen Schlüssel hinzufügen, fügen Sie den Schlüsselnamen zu einem Satz hinzu. Der Befehl "keys" ist nicht besonders nützlich, wenn Sie erst einmal skaliert haben, da die Rückkehr viel Zeit in Anspruch nimmt.

Lassen Sie das Zugriffsmuster bestimmen, wie Sie Ihre Daten strukturieren, anstatt sie so zu speichern, wie Sie es für richtig halten, und dann daran zu arbeiten, wie Sie später darauf zugreifen und sie reduzieren können. Sie werden eine weitaus bessere Leistung sehen und feststellen, dass der datenverbrauchende Code oft viel sauberer und einfacher ist.

In Bezug auf einzelne Threads ist zu beachten, dass redis für Geschwindigkeit und Atomarität ausgelegt ist. Sichere Aktionen, die Daten in einer Datenbank modifizieren, müssen nicht auf einer anderen Datenbank warten, sondern was passiert, wenn diese Aktion in der Speicherabbilddatei gespeichert wird oder Transaktionen auf Slaves verarbeitet werden? An diesem Punkt fangen Sie an, in die Unkräuter der Gleichzeitigkeitsprogrammierung zu geraten.

Indem Sie mehrere Instanzen verwenden, verwandeln Sie die Multi Threading-Komplexität in ein einfacheres Nachrichtenübergabestilsystem.

+0

Wenn ich jeden Schlüssel in einer Datenbank benötige, warum würde auf alle diese Schlüssel aus einer Menge zugreifen und dann iterieren durch schneller sein als der Schlüssel Befehl? Beide wären O (n), aber die set-Methode würde bis zu doppelt so viel Platz benötigen und viel mehr hin und her und Datenübertragung. – Eli

+41

Die Verwendung mehrerer Datenbanken ist veraltet? Können Sie bitte eine Referenz für diese Aussage bereitstellen? Mir ist bewusst, dass mehrere Datenbanken in Redis Cluster nicht unterstützt werden, aber es sind auch keine komplexen Multitastenbefehle, und sie sind nicht veraltet. – ostergaard

+18

[Einige (starke) Beweise] (https://code.google.com/p/redis/issues/detail?id=662#c4) vom "Eigentümer" von Redis (laut Google Code), dass ".. Datenbanken werden nicht veraltet sein, auch wenn ich in der Vergangenheit gesagt habe, dass sie es sein würden. " –

1

Ich benutze Redis für die Implementierung einer Blacklist von E-Mail-Adressen, und ich habe verschiedene TTL-Werte für verschiedene Ebenen der Blacklisting, so dass mir verschiedene DBs auf der gleichen Instanz hilft mir sehr.

+0

Warum nicht ablaufen? – Cmag

+0

Wir stehen jetzt vor dem gleichen Problem - wir wollen verschiedene LRU-Richtlinien für verschiedene Teile unserer Daten definieren. Kannst du bitte mitteilen, wie du das implementiert hast? – user2717436

+0

@ user2717436 Ich bin mir nicht sicher, ob das, was ich tue, mit deinem verwandt ist, aber ich benutze verschiedene Datenbanken als verschiedene Sets und setze immer die TTL der Schlüssel, wenn ich sie einfüge. So wie es Blacklist A auf redis.get (1) gibt, und wenn ich dort einen Schlüssel setze, setze ich das Expire auf 5000. und es gibt Blacklist B auf redis.get (2) und wann immer ich einen Schlüssel dort setze, setze ich expire auf 10000 – kommradHomer

2

Redis-Datenbanken können in den seltenen Fällen der Bereitstellung einer neuen Version der Anwendung verwendet werden, wenn die neue Version die Arbeit mit verschiedenen Entitäten erfordert.

31

Selbst Salvatore Sanfilippo (Autor von Redis) hält es für eine schlechte Idee, mehrere DBs in Redis zu verwenden. Siehe seinen Kommentar hier:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

Ich verstehe, wie dies nützlich sein kann, aber leider halte ich Redis mehrere Datenbankfehler meine schlechteste Entscheidung in Redis Design bei alle ... ohne jede Art von Echt gewinnen, macht es die Interna viel komplexer . Die Realität ist, dass Datenbanken nicht gut skalieren für eine Anzahl von Gründen, wie das aktive Ablaufen von Schlüsseln und VM. Wenn die DB Auswahl mit einer Zeichenkette durchgeführt werden kann, kann ich sehen, dass diese Eigenschaft ist, die als eine skalierbare O (1) Wörterbuchschicht verwendet wird, die es stattdessen nicht ist.

Mit DB-Nummern, mit einer Standard von einiger DBs, wir sind Kommunikation besser, was diese Funktion ist und wie kann ich denke, verwendet werden. Ich hoffe, dass irgendwann können wir die Unterstützung mehrerer DBs überhaupt fallen lassen, aber ich denke, ist es wahrscheinlich zu spät, da es eine Reihe von Menschen gibt, die sich auf diese Funktion für ihre Arbeit verlassen.