Heim  >  Artikel  >  Datenbank  >  So verwenden Sie die verzögerte Doppellöschstrategie von Redis

So verwenden Sie die verzögerte Doppellöschstrategie von Redis

WBOY
WBOYnach vorne
2023-06-02 20:32:141540Durchsuche

Normalerweise geben wir der Verwendung des Redis-Cache Vorrang, um die Belastung durch den Datenbankzugriff zu verringern. Wir werden jedoch auch auf die folgende Situation stoßen: Wenn eine große Anzahl von Benutzern auf unser System zugreift, fragen sie zuerst den Cache ab. Wenn sich keine Daten im Cache befinden, fragen sie die Datenbank ab und aktualisieren dann die Daten im Cache. und wenn sich die Daten in der Datenbank geändert haben, müssen sie mit Redis synchronisiert werden. Während des Synchronisierungsprozesses muss die Datenkonsistenz zwischen MySQL und Redis sichergestellt werden Letztendlich ist es notwendig, die Konsistenz zwischen MySQL und dem Cache sicherzustellen.

//我们通常使用redis的逻辑
    //通常我们是先查询reids
    String value = RedisUtils.get(key);
    if (!StringUtils.isEmpty(value)){
        return value;
    }
//从数据库中获取数据
    value = getValueForDb(key);
    if (!StringUtils.isEmpty(value)){
           RedisUtils.set(key,value);
        return value;
     }

1. Was ist eine verzögerte doppelte Löschung?

Die Strategie zum verzögerten doppelten Löschen ist eine gängige Strategie für die Datenbankspeicherung und den Cache von Daten, um die Konsistenz in verteilten Systemen aufrechtzuerhalten, sie ist jedoch nicht stark konsistent. Unabhängig davon, welche Lösung verwendet wird, kann das Problem schmutziger Daten in Redis nur durch Synchronisierungssperren und entsprechende Geschäftslogikebenen gelöst werden.

2. Warum sollten wir eine verzögerte doppelte Löschung durchführen?

Wenn wir Datenbankdaten aktualisieren, müssen wir im Allgemeinen die in Redis zwischengespeicherten Daten synchronisieren, daher geben wir im Allgemeinen zwei Lösungen an:

  • Eine Lösung : Führen Sie zuerst den Aktualisierungsvorgang und dann das Löschen des Caches durch.

  • Die zweite Option: Zuerst den Cache löschen und dann den Aktualisierungsvorgang durchführen.

Allerdings sind diese beiden Lösungen bei gleichzeitigen Anfragen anfällig für die folgenden Probleme

So verwenden Sie die verzögerte Doppellöschstrategie von Redis

Nachteile einer Lösung: Nachdem Anforderung 1 den Datenbankaktualisierungsvorgang durchgeführt hat, aber bevor der Cache geleert wurde, kommt Anforderung 2, um den Cache abzufragen. Zu diesem Zeitpunkt handelt es sich bei den Daten im Cache noch um alte Daten, und das war noch nicht der Fall Nachdem t1 den Cache-Löschvorgang durchgeführt hat, können nachfolgende Anforderungen den Cache nicht abfragen und dann nicht im Cache aktualisieren.

  1. #🎜 🎜#t1-Thread aktualisiert zuerst die Datenbank;

  2. t2-Thread-Abfrage trifft auf den Cache und gibt die alten Daten zurück; #

  3. Unter der Annahme, dass der T1-Thread die Datenbank aktualisiert hat, wird erwartet, dass der Cache-Schlüssel innerhalb von 5 Millisekunden gelöscht wird Die alten Daten, aber das Abfrage-Cache-Ergebnis ist nach 5 Millisekunden leer. Das neueste Datenbankergebnis wird erneut mit Redis synchronisiert.
  4. Verzögerungen bei einem Projekt kommen sehr häufig vor, daher sind die Auswirkungen solcher Verzögerungen auf das Geschäft tatsächlich sehr begrenzt. Was aber, wenn es passiert und das Löschen des Caches fehlschlägt?
  5. 1. Versuchen Sie es erneut ---- Wenn es sich um die HTTP-Protokollschnittstelle handelt, wird die Schnittstellenantwort langsamer und es kommt zu einer Antwortzeitüberschreitung beim Aufrufen der Schnittstelle. 2. Oder über mq Asynchrone Form der Synchronisierung

So verwenden Sie die verzögerte Doppellöschstrategie von RedisNachteile der zweiten Lösung: Wenn Anforderung 1 den Cache löscht, aber den Datenaktualisierungsvorgang noch nicht durchgeführt hat , Anfrage 2 kommt herein Die alten Daten der Datenbank werden abgefragt und in Redis geschrieben, was zu dem Problem der Inkonsistenz zwischen der Datenbank und den Redis-Daten führt.

    t1-Thread löscht zuerst den Cache;
  • t2-Thread liest den Cache als Null und synchronisiert Datenbankdaten bis Im Cache;
  • t1 Thread aktualisiert die Daten in der Datenbank;
  • t3 Thread fragt ab Daten im Cache. Alte Daten Warten Sie vor dem Ausführen des Cache-Aktualisierungsvorgangs N Sekunden, um den Cache nach Abschluss der Aktualisierung erneut zu leeren. Führen Sie zwei Löschvorgänge durch, und es ist eine Verzögerungszeit erforderlich . Wenn die Schreibzeit auf Redis früher als die Verzögerungszeit ist, löscht Anfrage 1 den Cache, aber der Cache von Anfrage 2 wurde noch nicht geschrieben, was zu einer peinlichen Situation führt. . .
  • 5. Wie ermittelt man die Verzögerungszeit?

    Sie wird basierend auf der Betriebszeit der Geschäftslogik geschätzt, um das Lesen von Daten und das Schreiben des Caches auszuführen, wenn das Geschäftsprogramm ausgeführt wird. „Verzögertes doppeltes Löschen“ liegt daran, dass diese Lösung den zwischengespeicherten Wert nach einer gewissen Zeitverzögerung nach dem ersten Löschen erneut löscht.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die verzögerte Doppellöschstrategie von Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen