Antworten:
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.
Natürlich gibt es weit mehr Unterschiede als diese, aber für einen extrem hohen Überblick:
Für Anwendungsfälle:
Technisch:
Es gibt einige Überlappungen, aber es ist äußerst üblich, beide zu verwenden. Hier ist der Grund:
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.
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.