Da Sie einen Cache verwenden, müssen Sie das Problem der Dateninkonsistenz in Kauf nehmen , d.h. irgendwann unterscheiden sich die Daten im Cache von den Daten in der Datenbank.
Sie müssen den Wert im Cache nicht aktualisieren, wenn der Wert geändert wurde. Andernfalls wird das gesamte Cache-System sehr kompliziert (z. B. müssen Sie eine Liste von Schlüsseln führen, die zwischengespeichert wurden), und es kann auch unnötig sein, dies zu tun (z. B. wird der Schlüsselwert möglicherweise nur einmal verwendet und ist nicht erforderlich). um es weiter zu aktualisieren).
Wie können wir die Daten im Cache aktualisieren und das Cache-System einfach halten?
Normalerweise legen wir neben dem Festlegen oder Aktualisieren eines Schlüsselwertpaars im Cache auch einen TIMEOUT
fest für jeden Schlüssel . Danach kann der Client das Schlüssel-Wert-Paar aus dem Cache abrufen. Erreicht ein Schlüssel jedoch das Timeout, entfernt das Cache-System das Schlüssel-Wert-Paar aus dem Cache. Dies wird als THE KEY HAS BEEN EXPIRED
bezeichnet . Das nächste Mal, wenn der Client versucht, diesen Schlüssel aus dem Cache abzurufen, erhält er nichts. Dies wird CACHE MISS
genannt . In diesem Fall muss der Client das Schlüssel-Wert-Paar aus der Datenbank abrufen und mit einem neuen Timeout im Cache aktualisieren.
Wenn die Daten in der Datenbank aktualisiert wurden, während der Schlüssel im Cache NICHT abgelaufen ist, erhält der Client inkonsistente Daten. Wenn der Schlüssel jedoch abgelaufen ist, wird sein Wert aus der Datenbank abgerufen und von einem Client in den Cache eingefügt. Danach erhalten andere Clients aktualisierte Daten, bis die Daten erneut geändert wurden.
Wie stelle ich das Timeout ein?
Normalerweise gibt es zwei Arten von Ablaufrichtlinien:
- Ablaufen in
N
Sekunden/Minuten/Stunden... - Verfallen zu einem späteren Zeitpunkt, z. läuft am 30.07.2017 00:00:00 ab
Ein großes Timeout kann die Belastung der Datenbank stark reduzieren, während die Daten für lange Zeit veraltet sein können. Ein kleines Timeout kann die Daten so aktuell wie möglich halten, während die Datenbank stark belastet wird. Also müssen Sie den Kompromiss beim Entwerfen des Timeouts ausgleichen .
Wie läuft Redis Schlüssel ab?
Redis hat zwei Möglichkeiten, Schlüssel ablaufen zu lassen:
- Wenn der Client versucht, einen Schlüssel zu bearbeiten, prüft Redis, ob der Schlüssel das Timeout erreicht hat. Wenn dies der Fall ist, entfernt Redis den Schlüssel und verhält sich so, als ob der Schlüssel nicht existiert. Auf diese Weise stellt Redis sicher, dass der Client keine abgelaufenen Daten erhält.
- Redis hat auch einen Ablauf-Thread, der Schlüssel mit einer konfigurierten Häufigkeit abtastet. Wenn die Schlüssel das Timeout erreichen, entfernt Redis diese Schlüssel. Auf diese Weise kann Redis den Schlüsselablaufprozess beschleunigen.