MongoDB mit Redis

95

Kann jemand Anwendungsbeispiele nennen, bei denen Sie von der Verwendung von Redis und MongoDB in Verbindung miteinander profitieren würden?

tonyl7126
quelle

Antworten:

158

Redis und MongoDB können zusammen mit guten Ergebnissen verwendet werden. Ein Unternehmen, das für die Ausführung von MongoDB und Redis (zusammen mit MySQL und Sphinx) bekannt ist, ist Craiglist. Siehe diese Präsentation von Jeremy Zawodny.

MongoDB ist interessant für persistente, dokumentenorientierte Daten, die auf verschiedene Weise indiziert werden. Redis ist interessanter für flüchtige Daten oder latenzempfindliche semi-persistente Daten.

Hier sind einige Beispiele für die konkrete Verwendung von Redis zusätzlich zu MongoDB.

  • MongoDB vor 2.2 verfügt noch nicht über einen Ablaufmechanismus. Mit einer Kappe versehene Sammlungen können nicht wirklich zum Implementieren einer echten TTL verwendet werden. Redis verfügt über einen TTL-basierten Ablaufmechanismus, mit dem flüchtige Daten bequem gespeichert werden können. Beispielsweise werden Benutzersitzungen üblicherweise in Redis gespeichert, während Benutzerdaten in MongoDB gespeichert und indiziert werden. Beachten Sie, dass MongoDB 2.2 auf Erfassungsebene einen Ablaufmechanismus mit geringer Genauigkeit eingeführt hat (der beispielsweise zum Löschen von Daten verwendet werden soll).

  • Redis bietet einen praktischen Datentyp für Sätze und die damit verbundenen Operationen (Vereinigung, Schnittmenge, Differenz bei mehreren Sätzen usw.). Es ist recht einfach, eine grundlegende facettierte Such- oder Tagging-Engine zusätzlich zu dieser Funktion zu implementieren. Dies ist eine interessante Ergänzung zu den traditionelleren Indizierungsfunktionen von MongoDB.

  • Redis unterstützt das effiziente Blockieren von Pop-Vorgängen in Listen. Dies kann verwendet werden, um ein verteiltes Ad-hoc-Warteschlangensystem zu implementieren. Es ist flexibler als IMO-Cursor mit MongoDB-Tailing, da eine Backend-Anwendung mehrere Warteschlangen mit einer Zeitüberschreitung abhören, Elemente atomar in eine andere Warteschlange übertragen kann usw. Wenn die Anwendung eine Warteschlange erfordert, ist es sinnvoll, die Warteschlange in Redis zu speichern und behalten Sie die persistenten Funktionsdaten in MongoDB bei.

  • Redis bietet auch einen Pub / Sub-Mechanismus an. In einer verteilten Anwendung kann ein Ereignisausbreitungssystem nützlich sein. Dies ist wiederum ein hervorragender Anwendungsfall für Redis, während die persistenten Daten in MongoDB gespeichert werden.

Da es mit MongoDB viel einfacher ist, ein Datenmodell zu entwerfen als mit Redis (Redis ist niedriger), ist es interessant, von der Flexibilität von MongoDB für persistente Hauptdaten und von den zusätzlichen Funktionen von Redis (geringe Latenz) zu profitieren , Artikelablauf, Warteschlangen, Pub / Sub, Atomblöcke usw.). Es ist in der Tat eine gute Kombination.

Bitte beachten Sie, dass Sie niemals einen Redis- und einen MongoDB-Server auf demselben Computer ausführen sollten. MongoDB-Speicher soll ausgelagert werden, Redis nicht. Wenn MongoDB eine Austauschaktivität auslöst, ist die Leistung von Redis katastrophal. Sie sollten auf verschiedenen Knoten isoliert sein.

Didier Spezia
quelle
19
MongoDB 2.2 (gerade veröffentlicht) fügt TTL-Unterstützung hinzu, die Ihren ersten Punkt anspricht
John Zwinck
Tolle Punkte zu einigen der vergleichenden Stärken der einzelnen.
Brian Bulkowski
2
Tolle Punkte zu einigen der vergleichenden Stärken der einzelnen. Einer der Punkte von Redis ist die Abstimmung im Speicher. Es gibt andere Projekte, die sich auf niedrige Latenz konzentrieren, wie beispielsweise AerospikeDB, die sich auf Clustering und Zuverlässigkeit konzentrieren, sowie SSD-Speicher, der verwendet werden kann, wenn der Echtzeit-Anwendungsfall über das hinausgeht, was Redis problemlos handhaben kann.
Brian Bulkowski
das Video selbst von Jeremy Zawodnys Vortrag: youtube.com/watch?v=qFcB1Xw1WSk
Frankenmint
25

Natürlich gibt es weit mehr Unterschiede als diese, aber für einen extrem hohen Überblick:

Für Anwendungsfälle:

  • Redis wird häufig als Caching-Ebene oder freigegebenes Whiteboard für verteilte Berechnungen verwendet.
  • MongoDB wird häufig als Ersatz für herkömmliche SQL-Datenbanken verwendet.

Technisch:

  • Redis ist eine speicherinterne Datenbank mit Festplattenpersistenz (die gesamte Datenbank muss in den Arbeitsspeicher passen).
  • MongoDB ist eine festplattengestützte Datenbank, die nur genügend RAM für die Indizes benötigt.

Es gibt einige Überlappungen, aber es ist äußerst üblich, beide zu verwenden. Hier ist der Grund:

  • MongoDB kann mehr Daten billiger speichern.
  • Redis ist für den gesamten Datensatz schneller.
  • Die Kultur von MongoDB lautet: "Alles speichern, Zugriffsmuster später herausfinden"
  • Redis 'Kultur lautet: "Überlegen Sie genau, wie Sie auf Daten zugreifen und diese dann speichern."
  • Beide haben Open-Source-Tools, die von ihnen abhängen und von denen viele zusammen verwendet werden.

Redis kann als Ersatz für einen herkömmlichen Datenspeicher verwendet werden, wird jedoch am häufigsten mit einem anderen normalen "langen" Datenspeicher wie Mongo, Postgresql, MySQL usw. verwendet.

Brian P O'Rourke
quelle
0

Redis arbeitet hervorragend mit MongoDB als Caching-Server zusammen. Hier ist was passiert.

Jedes Mal, wenn ein Mungo eine Cache-Abfrage ausgibt, wird diese zuerst an den Cache-Server weitergeleitet.

Der Cache-Server prüft, ob diese genaue Abfrage jemals zuvor ausgegeben wurde.

Wenn dies nicht der Fall ist, nimmt der Cache-Server die Abfrage entgegen, sendet sie an mongodb und Mongo führt die Abfrage aus.

Wir werden dann das Ergebnis dieser Abfrage nehmen, es geht dann zurück zum Cache-Server, der Cache-Server speichert das Ergebnis der Abfrage auf sich selbst.

Jedes Mal, wenn ich diese Abfrage ausführe, wird diese Antwort angezeigt. Daher wird ein Datensatz zwischen den ausgegebenen Abfragen und den Antworten, die von diesen Abfragen zurückkommen, geführt.

Der Cache-Server nimmt die Antwort entgegen und sendet sie an Mungo zurück. Mungo gibt sie zum Ausdrücken und landet schließlich in der Anwendung.

Jedes Mal, wenn dieselbe exakte Abfrage erneut ausgegeben wird, sendet Mungo dieselbe Abfrage an den Cache-Server. Wenn der Cache-Server jedoch feststellt, dass diese Abfrage ausgegeben wurde, bevor er die Abfrage nicht an mongodb sendet, wird stattdessen die Antwort an gesendet die Abfrage, die es das letzte Mal bekam und sofort an Mungo zurücksendet. Hier gibt es keine Indizes, keinen vollständigen Tabellenscan, nichts.

Wir führen eine einfache Suche durch, um festzustellen, ob diese Abfrage ausgeführt wurde. Ja? Okay, nimm die Anfrage an und sende sie sofort zurück und sende nichts an Mongo.

Wir haben den Mungoserver, den Cache-Server (Redis) und Mongodb.

Auf dem Cache-Server befindet sich möglicherweise ein Datenspeicher mit dem Schlüsselwerttyp des Datenspeichers, in dem alle Schlüssel eine zuvor ausgegebene Abfrageart und der Wert das Ergebnis dieser Abfrage sind.

Vielleicht suchen wir nach einer Reihe von Blogposts von _id.

Vielleicht sind die Schlüssel hier die ID der Datensätze, die wir zuvor nachgeschlagen haben.

Stellen wir uns also vor, dass Mungo eine neue Abfrage ausgibt, bei der versucht wird, einen Blogpost mit der _id 123 zu finden. Die Abfrage fließt in den Cache-Server. Der Cache-Server prüft, ob für eine Abfrage, die nach einer _id gesucht hat, ein Ergebnis vorliegt von 123.

Wenn es auf dem Cache-Server nicht vorhanden ist, wird diese Abfrage übernommen und an die Mongodb-Instanz weitergeleitet. Mongodb führt die Abfrage aus, erhält eine Antwort und sendet sie zurück.

Dieses Ergebnis wird an den Cache-Server zurückgesendet, der dieses Ergebnis aufnimmt und sofort an Mungo zurücksendet, damit wir so schnell wie möglich eine Antwort erhalten.

Unmittelbar danach nimmt der Cache-Server auch die ausgegebene Abfrage entgegen und fügt sie seiner Sammlung von ausgegebenen Abfragen hinzu. Er nimmt das Ergebnis der Abfrage und speichert es direkt für die Abfrage.

Wir können uns also vorstellen, dass wir in Zukunft dieselbe Abfrage erneut ausgeben, sie auf den Cache-Server trifft, alle vorhandenen Schlüssel überprüft und sagt: Oh, ich habe diesen Blogpost bereits gefunden, er erreicht Mongo nicht, er braucht nur das Ergebnis der Abfrage und sendet es direkt an Mungo.

Wir machen keine komplexe Abfragelogik, keine Indizes, nichts dergleichen. Es ist so schnell wie möglich. Es ist eine einfache Suche nach Schlüsselwerten.

Das ist eine Übersicht darüber, wie der Cache-Server (Redis) mit MongoDB funktioniert.

Jetzt gibt es andere Bedenken. Zwischenspeichern wir Daten für immer? Wie aktualisieren wir Datensätze?

Wir möchten nicht immer Daten im Cache speichern und aus dem Cache lesen.

Der Cache-Server wird nicht für Schreibaktionen verwendet. Die Cache-Schicht wird nur zum Lesen von Daten verwendet. Wenn wir jemals Daten schreiben, wird das Schreiben immer an die Mongodb-Instanz übergeben, und wir müssen sicherstellen, dass wir beim Schreiben von Daten alle auf dem Cache-Server gespeicherten Daten löschen, die sich auf den gerade in Mongo aktualisierten Datensatz beziehen.

Daniel
quelle