Heim >Datenbank >MySQL-Tutorial >Wie Redis die Konsistenz mit MySQL aufrechterhält
Es gibt zwei Möglichkeiten, die Konsistenz zwischen Redis und MySQL aufrechtzuerhalten: 1. Führen Sie den Vorgang [redis.del(key)] vor und nach dem Schreiben der Datenbank aus und legen Sie eine angemessene Zeitüberschreitung fest Der auf dem Abonnieren von Binlog basierende Synchronisationsmechanismus erreicht die Konsistenz zwischen Redis und MySQL.
Die Methode zur Aufrechterhaltung der Konsistenz zwischen Redis und MySQL besteht darin, eine verzögerte Doppellöschstrategie anzuwenden, zuerst den Cache zu löschen und dann in die Datenbank zu schreiben besteht darin, den Cache zuerst asynchron zu lesen, dann MySQL zu schreiben und dann die Redis-Daten zu aktualisieren
Die Cache- und Datenbankkonsistenzlösung lautet wie folgt:
Methode 1: Verzögerungs-Doppellöschstrategie verwenden
Führen Sie den redis.del(key)-Vorgang vor und nach dem Schreiben der Datenbank durch und legen Sie eine angemessene Zeitüberschreitung fest.
Der Pseudocode lautet wie folgt
public void write(String key,Object data){ redis.delKey(key); db.updateData(data); Thread.sleep(500); redis.delKey(key); }
Die spezifischen Schritte sind:
(1) Löschen Sie zuerst den Cache
( 2) Dann Datenbank schreiben
(3) 500 Millisekunden ruhen lassen
(4) Cache erneut löschen
Also, wie werden diese 500 Millisekunden ermittelt und wie lang sollten sie sein? schlafen?
Sie müssen die zeitaufwändige Geschäftslogik für das Lesen von Daten Ihres Projekts bewerten. Der Zweck besteht darin, sicherzustellen, dass die Leseanforderung endet und die Schreibanforderung die durch die Leseanforderung verursachten zwischengespeicherten schmutzigen Daten löschen kann.
Natürlich berücksichtigt diese Strategie auch die zeitaufwändige Synchronisation zwischen Redis und dem Datenbank-Master-Slave. Die letzte Ruhezeit zum Schreiben von Daten: Fügen Sie der Zeit, die zum Lesen der Datengeschäftslogik benötigt wird, einige hundert Millisekunden hinzu. Zum Beispiel: 1 Sekunde schlafen.
Legen Sie die Cache-Ablaufzeit fest
Theoretisch ist das Festlegen der Cache-Ablaufzeit eine Lösung, um letztendlich Konsistenz sicherzustellen. Alle Schreibvorgänge unterliegen der Datenbank. Solange die Cache-Ablaufzeit erreicht ist, lesen nachfolgende Leseanforderungen natürlich neue Werte aus der Datenbank und füllen den Cache auf.
Nachteile dieser Lösung
In Kombination mit der Doppellöschstrategie + Cache-Timeout-Einstellung besteht das schlimmste Szenario darin, dass die Daten innerhalb des Timeout-Zeitraums inkonsistent sind, und noch mehr Schreibvorgänge werden hinzugefügt.
Methode 2: Asynchroner Update-Cache (Synchronisationsmechanismus basierend auf Abonnement-Binlog)
Gesamttechnische Idee:
MySQL-Binlog Inkrementeller Abonnementverbrauch + Nachrichtenwarteschlange + inkrementelle Datenaktualisierung auf Redis
1) Lesen von Redis: Heiße Daten sind grundsätzlich in Redis
2) Schreiben von MySQL: Hinzufügungen, Löschungen und Änderungen sind alles Vorgänge auf MySQL
3) Redis-Daten aktualisieren: MySQ-Datenoperations-Binlog, um auf Redis zu aktualisieren
Redis-Update
(1) Datenoperationen sind hauptsächlich unterteilt in zwei Hauptblöcke:
Einer ist voll (alle Daten auf einmal auf Redis schreiben) und der andere ist inkrementell (Echtzeitaktualisierung)
Wovon wir hier sprechen, ist inkrementell, was sich bezieht Um MySQL zu aktualisieren und geänderte Daten einzufügen und zu löschen.
(2) Nachdem Sie das Binlog gelesen haben, analysieren Sie es und verwenden Sie die Nachrichtenwarteschlange, um die Redis-Cache-Daten jeder Station zu übertragen und zu aktualisieren.
Auf diese Weise können Binlog-bezogene Nachrichten an Redis gesendet werden, sobald in MySQL neue Schreib-, Aktualisierungs-, Lösch- und andere Vorgänge ausgeführt werden, und Redis aktualisiert Redis basierend auf den Datensätzen im Binlog.
Tatsächlich ist dieser Mechanismus dem Master-Slave-Sicherungsmechanismus von MySQL sehr ähnlich, da die Master-Slave-Sicherung von MySQL auch Datenkonsistenz über Binlog erreicht.
Hier können Sie Canal (ein Open-Source-Framework von Alibaba) verwenden, über das Sie MySQLs Binlog abonnieren können, und Canal imitiert die Sicherungsanforderung der MySQL-Slave-Datenbank, um Redis-Daten zu aktualisieren. Erzielt den gleichen Effekt.
Natürlich können Sie hier auch andere Drittanbieter für die Nachrichten-Push-Tools nutzen: Kafka, RabbitMQ usw., um Push-Updates für Redis umzusetzen
Das obige ist der detaillierte Inhalt vonWie Redis die Konsistenz mit MySQL aufrechterhält. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!