Im April ging ein Freund zu einem Interview nach Meituan. Er sagte, er sei gefragt worden, wie man die Konsistenz von Dual-Write zwischen Redis und MySQL sicherstellen könne. Bei dieser Frage geht es tatsächlich darum, wie die Konsistenz von Cache und Datenbank in einem Double-Write-Szenario sichergestellt werden kann. In diesem Artikel erfahren Sie, wie Sie diese Frage beantworten können.
Konsistenz ist die Konsistenz von Daten. In einem verteilten System kann sie als die Konsistenz von Daten in mehreren verstanden werden Knoten Die Werte sind konsistent.
Cache-Aside-Muster
Cache-Aside-Lesevorgang
Lesen Sie beim Lesen zuerst den Cache, werden die Daten direkt zurückgegeben
Wenn der Cache nicht erreicht wird, lesen Sie einfach die Datenbank, rufen Sie die Daten aus der Datenbank ab, legen Sie sie in den Cache und geben Sie gleichzeitig die Antwort zurück.Beim Aktualisieren
aktualisieren Sie zuerst die Datenbank und löschen Sie dann den Cache.
Read-Through/Write-Through (Lese-/Schreibdurchdringung)
Read-/Write-Throughvervollständigt. Durchlesen
DurchlesenWenn sie nicht gelesen werden können, laden Sie sie aus der Datenbank und schreiben Sie Legen Sie es dann in den Cache zurück.
Ist dieser kurze Prozess ähnlich wieCache-Aside? Tatsächlich ist
Read-ThroughWrite-Through-Modus schließt die Cache-Abstraktionsschicht auch die Aktualisierung der Datenquelle und der zwischengespeicherten Daten ab:
Schreiben hinter ( asynchrones Cache-Schreiben) Write behindähnelt Read-Through/Write-Through, da
für das Lesen und Schreiben von Cache und Datenbank verantwortlich ist. Es gibt einen großen Unterschied zwischen ihnen:Write Behind nur den Cache aktualisiert, die Datenbank nicht direkt aktualisiert und die Datenbank über Batch asynchron aktualisiert.
Auf diese Weise ist die Konsistenz zwischen Cache und Datenbank nicht starkSysteme mit hohen Konsistenzanforderungen sollten mit Vorsicht verwendet werden. Es eignet sich jedoch für häufige Schreibszenarien. Der „InnoDB Buffer Pool“-Mechanismus von MySQL verwendet diesen Modus. Sollten Sie beim Betrieb des Caches den Cache löschen oder aktualisieren? Cache Provider
In allgemeinen Geschäftsszenarien verwenden wir den Cache-Aside-Modus.
Einige Freunde fragen sich vielleicht: Cache-AsideWarum beim Schreiben einer Anfrage den Cache löschen, anstatt ihn zu aktualisieren?
Sollten wir den Cache löschen oder aktualisieren, wenn wir den Cache betreiben? Schauen wir uns zunächst ein Beispiel an:
Zu diesem Zeitpunkt speichert der Cache die Daten von A (alte Daten) und die Datenbank speichert die Daten von B (neue Daten). Die Daten sind inkonsistent und es werden fehlerhafte Daten angezeigt. Wenn Sie den Cache löschen, anstatt ihn zu aktualisieren, tritt dieses Problem mit schmutzigen Daten nicht auf. Das Aktualisieren des Caches hat im Vergleich zum Löschen des Caches zwei Nachteile:
Wenn der von Ihnen geschriebene Cache-Wert nach komplexen Berechnungen ermittelt wird. Wenn der Cache häufig aktualisiert wird, wird Leistung verschwendet. Wenn es viele Datenbankschreibszenarien und wenige Datenleseszenarien gibt, werden die Daten häufig vor dem Lesen aktualisiert, was auch zu Leistungseinbußen führt (eigentlich ist Caching in Szenarien mit viel Schreibvorgang nicht die beste Lösung). Sehr kostengünstig)
Cache-Aside
-Cache-Modus haben einige Freunde immer noch Fragen: Warum Cache-Aside
缓存模式中,有些小伙伴还是有疑问,在写入请求的时候,为什么是先操作数据库呢?为什么不先操作缓存呢?
假设有A、B两个请求,请求A做更新操作,请求B做查询读取操作。
酱紫就有问题啦,缓存和数据库的数据不一致了。缓存保存的是老数据,数据库保存的是新数据。因此,Cache-Aside
Angenommen, es gibt zwei Anfragen, A und B, die A auffordern, den Aktualisierungsvorgang durchzuführen, und B auffordern, den Abfrage- und Lesevorgang durchzuführen.
Thread A schreibt die neuesten Daten in die Datenbank
Es liegt ein Problem mit Jiang Zi vor. Die Daten im Cache und in der Datenbank sind inkonsistent. Der Cache speichert alte Daten und die Datenbank speichert neue Daten. Daher wählt der Caching-Modus Cache-Aside
zuerst die Datenbank und nicht zuerst den Cache.
Löschen Sie zuerst den Cache und aktualisieren Sie dann die Datenbank.
Wie lange dauert es normalerweise, eine Weile einzuschlafen? Sind sie alle 1 Sekunde lang? Diese Ruhezeit = die Zeit, die zum Lesen von Geschäftslogikdaten benötigt wird + ein paar hundert Millisekunden. Um sicherzustellen, dass die Leseanforderung endet, kann die Schreibanforderung zwischengespeicherte fehlerhafte Daten löschen, die möglicherweise durch die Leseanforderung mitgebracht wurden.
oderCache-Wiederholungsmechanismus löschenOb es sich um
verzögertes doppeltes Löschen
Cache-Aside handelt, das zuerst die Datenbank betreibt und dann den Cache löscht, wenn der zweite Schritt des Löschens des Caches fehlschlägt, führt dies zu einem Löschfehler schmutzige Daten ~
Legen Sie den Schlüssel, der nicht gelöscht werden konnte, in die Nachrichtenwarteschlange.Lesen Sie Nachrichten aus der Nachrichtenwarteschlange, um den zu löschenden Schlüssel zu erhalten asynchrones Löschen des Caches
Löschung erneut versuchen Der Cache-Mechanismus ist in Ordnung, d. h. Es führt zu vielen Eingriffen in den Geschäftscode. Tatsächlich können Sie den Schlüssel auch asynchron über das Binlog der Datenbank entfernen.
Am Beispiel von MySQL können Sie den Alibaba-Kanal verwenden, um Binlog-Protokolle zu sammeln und an die MQ-Warteschlange zu senden, und dann die Aktualisierungsnachricht über den ACK-Mechanismus zu bestätigen und zu verarbeiten, den Cache zu löschen und die Daten-Cache-Konsistenz sicherzustellen Empfohlenes Lernen: „Das obige ist der detaillierte Inhalt vonWie kann die Doppelschreibkonsistenz zwischen Redis und MySQL sichergestellt werden? (Meituan Ermian). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!