In großen Systemen werden normalerweise Caching-Mechanismen eingeführt, um den Datenbankdruck zu verringern. Sobald Caching eingeführt wird, kann es leicht zu Inkonsistenzen zwischen Cache- und Datenbankdaten kommen, sodass Benutzer alte Daten sehen .
Um Dateninkonsistenzen zu reduzieren, ist der Mechanismus zur Aktualisierung des Caches und der Datenbank besonders wichtig. Als nächstes werde ich Sie durch die Fallstricke führen.
Cache beiseite
Bypass Cache ist eine häufig verwendete Caching-Strategie. Cache aside也就是旁路缓存,是比较常用的缓存策略。
🎜Cache beiseite Schreibanfrage🎜🎜🎜Zuerst aktualisieren Datenbank und löschen Sie die Daten aus dem Cache. 🎜🎜Nachdem sie sich das Bild der Schreibanfrage angesehen haben, fragen sich einige Schüler möglicherweise: Warum müssen wir den Cache löschen? Können wir ihn nicht einfach direkt aktualisieren? Hier gibt es mehrere Fallstricke. Lassen Sie uns diese Schritt für Schritt durchgehen. 🎜
Cache-Aside-Trap
🎜Cache-Aside-Strategie tritt auf, wenn sie falsch verwendet wird. Es ist tief Grube, lasst uns einer nach dem anderen hineingehen. 🎜🎜🎜 Fallstrick 1: Aktualisieren Sie zuerst die Datenbank und dann den Cache🎜🎜Wenn es zwei Schreibanforderung muss Daten aktualisieren. Jede Schreibanforderung aktualisiert zuerst die Datenbank und dann den Cache. In gleichzeitigen Szenarien kann es zu Dateninkonsistenzen kommen. 🎜🎜🎜Aktualisieren Sie zuerst die Datenbank und dann den Cache.🎜🎜🎜Ausführung als oben gezeigt Prozess: 🎜🎜(1)Anfrage 2 schreibenAktualisieren Sie die Datenbank und aktualisieren Sie das Altersfeld auf 20;🎜
(3)写请求2更新缓存,缓存 age 设置为20;
(4)写请求1更新缓存,缓存 age 设置为18;
执行完预期结果是数据库 age 为20,缓存 age 为20,结果缓存 age为18,这就造成了缓存数据不是最新的,出现了脏数据。
(4) Der Verarbeitungsablauf der Schreibanforderung ist Löschen Sie zuerst den Cache und aktualisieren Sie dann die Datenbank, in einem Read request und ein Schreibanforderung In gleichzeitigen Szenarien kann es zu Dateninkonsistenzen kommen. 🎜Löschen Sie zuerst den Cache und aktualisieren Sie dann die Datenbank🎜Der Ausführungsprozess wie oben gezeigt:🎜🎜(1)Write requestCache-Daten löschen; 🎜🎜(2)Read request Cache-Miss abfragen (Hit Miss) und dann die Datenbank abfragen , schreibe die zurückgegebenen Daten zurück in den Cache; 🎜🎜(3)Anfrage schreiben zum Aktualisieren der Datenbank. 🎜
Nach dem gesamten Vorgang habe ich festgestellt, dass 数据库中age为20,缓存中age为18,缓存和数据库数据不一致,缓存出现了脏数据。
Falle 3: Zuerst die Datenbank aktualisieren und dann den Cache löschenIm tatsächlichen System Schreibanfrage oder empfohlenAktualisieren Sie zuerst die Datenbank und löschen Sie dann den Cache, aber theoretisch gibt es immer noch Probleme, wie im folgenden Beispiel gezeigt. 🎜Aktualisieren Sie zuerst die Datenbank und löschen Sie dann den Cache🎜Der Ausführungsprozess wie oben gezeigt:🎜🎜(1)Read request fragt zuerst den Cache ab. Wenn der Cache nicht erreicht wird, wird abgefragt Datenbank zur Rückgabe von Daten; 🎜🎜 (2)Datenbankalter ist 20, Cache-Alter beträgt 18 code>, das heißt, die Datenbank und der Cache sind inkonsistent, was dazu führt, dass die von der Anwendung aus dem Cache gelesenen Daten alte Daten sind. 🎜🎜Aber wenn wir sorgfältig darüber nachdenken, ist die Wahrscheinlichkeit, dass das oben genannte Problem auftritt, tatsächlich sehr gering, da Datenbankaktualisierungsvorgänge normalerweise mehrere Größenordnungen mehr Zeit in Anspruch nehmen als Speichervorgänge. Der letzte Schritt im Bild oben ist das Zurückschreiben Cache (Alter 18 einstellen) sehr schnell. Dies geschieht normalerweise vor dem Aktualisieren der Datenbank. 🎜<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;text-align: justify;font-size: 15px;">Was tun, wenn dieses Extremszenario eintritt? Wir müssen uns eine Lösung überlegen: <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(0, 0, 153);“>Ablaufzeit der Cache-Dateneinstellung . Normalerweise kann es im System vorkommen, dass eine kleine Datenmenge für kurze Zeit inkonsistent ist.
Read through
Im Cache Aside-Aktualisierungsmodus muss der Anwendungscode zwei beibehalten Es gibt zwei Datenquellen: eine ist der Cache und die andere ist die Datenbank. Und in Cache-Anbieter. Alle Dateninteraktionen erfolgen über Read-Through-Prozess🎜Wie oben gezeigt, muss die Anwendung nur mit Cache ProviderInteraktion, unabhängig davon, ob sie aus dem Cache oder der Datenbank abgerufen wird. 🎜🎜Bei umfangreichen Lesevorgängen gilt:
In Cache-Aside ist die Anwendung dafür verantwortlich, Daten von der Datenquelle abzurufen und im Cache zu aktualisieren.
Bei Read-Through wird diese Logik normalerweise von einem unabhängigen Cache-Anbieter (Cache Provider) unterstützt.
Durchschreiben
Cache-Anbieter ist für die Aktualisierung der zugrunde liegenden Datenquelle und des Caches verantwortlich. Write-Through 策略下,当发生数据更新(Write)时,缓存提供程序 Cache Provider 负责更新底层数据源和缓存。
Der Cache stimmt mit der Datenquelle überein und Schreibvorgänge passieren immer -color: rgba(27, 31, 35, 0.05);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(0, 0, 153); ">Abstrakte Caching-Ebene erreicht die Datenquelle. 🎜🎜Write-Through-Prozess🎜🎜🎜Hinterschreiben🎜🎜Write behind wird an manchen Stellen auch Zurückschreiben, ein einfaches Verständnis ist: Wenn die Anwendung Daten aktualisiert, aktualisiert sie nur den Cache, Cache Provider aktualisiert in regelmäßigen Abständen Daten in der Datenbank. Um es ganz klar auszudrücken: Es istSchreiben hinter dem Prozess
Wie im Bild oben gezeigt, schreibt der Cache-Anbieter beim Aktualisieren zweier Daten durch die Anwendung diese sofort in den Cache, nach einer gewissen Zeit werden sie jedoch stapelweise in die Datenbank geschrieben.
Diese Methode hat Vor- und Nachteile:
优点是数据写入速度非常快,适用于频繁写的场景。
缺点
Zusammenfassend
Nachdem ich so viel gelernt habe, glaube ich, dass jeder ein klares Verständnis der Cache-Update-Strategie hat. Abschließend noch eine kleine Zusammenfassung. Es gibt drei Hauptstrategien für die Cache-Aktualisierung:
Cache beiseite
Durchlesen/Schreiben
Nachschreiben
Cache beiseite aktualisiert normalerweise zuerst die Datenbank und löscht dann normalerweise den Cache legt außerdem eine Cache-Zeit für die Daten fest. Lesen/Schreiben wird im Allgemeinen von einem Cache-Anbieter für externe Lese- und Schreibvorgänge bereitgestellt, und die Anwendung muss nicht wissen, ob der Cache oder die Datenbank betrieben wird. 🎜🎜Write dahinter versteht einfach, dass es sich um einen verzögerten Schreibvorgang handelt. Der Cache-Anbieter führt von Zeit zu Zeit eine Stapeleingabe in die Datenbank durch. Der Vorteil besteht darin, dass die Anwendung sehr schnell schreibt. 🎜🎜Okay, das war's für heute. Hast du die Lektion gelernt? 🎜
Das obige ist der detaillierte Inhalt vonSollte in einem Szenario mit hoher Parallelität zuerst der Cache oder die Datenbank aktualisiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn