Dieser Artikel bringt Ihnen relevantes Wissen über Redis, das hauptsächlich die relevanten Inhalte zu Cache-Lawine, Cache-Aufschlüsselung und Cache-Penetration vorstellt. Ich hoffe, es wird für alle hilfreich sein.
Empfohlenes Lernen: Redis-Video-Tutorial
In Bezug auf die Hochfrequenzprobleme von Redis müssen Cache-Lawine, Cache-Aufschlüsselung und Cache-Penetration unverzichtbar sein. Ich glaube, dass jedem in Interviews ähnliche Fragen gestellt wurden. Warum sind diese Fragen so beliebt? Denn wenn wir den Redis-Cache verwenden, können diese Probleme leicht auftreten. Schauen wir uns als Nächstes an, wie diese Probleme entstehen und welche Lösungen es gibt.
Cache-Lawine
Werfen wir zunächst einen Blick auf die Cache-Lawine Das Konzept der Cache-Lawine besteht darin, dass eine große Anzahl von Anfragen nicht im Redis-Cache verarbeitet wird, was dazu führt, dass Anfragen in die Datenbank überflutet werden und dann der Druck zunimmt Die Datenbank vergrößert sich dramatisch.
Die Gründe für die Cache-Lawine lassen sich in zwei Gründe zusammenfassen:
- Eine große Datenmenge im Cache läuft gleichzeitig ab, sodass zu diesem Zeitpunkt eine große Anzahl von Anfragen an die Datenbank gesendet wird.
- Die Redis-Cache-Instanz fällt aus und kann eine große Anzahl von Anfragen nicht verarbeiten, was auch dazu führt, dass die Anfragen an die Datenbank weitergeleitet werden.
Schauen wir uns das erste Szenario an: Eine große Datenmenge im Cache läuft gleichzeitig ab.
Eine große Datenmenge im Cache ist gleichzeitig abgelaufen
Der Legende nach bedeutet dies, dass eine große Datenmenge gleichzeitig abgelaufen ist und es zu diesem Zeitpunkt viele Anfragen zum Lesen der Daten gab. Natürlich wird es zu einer Cache-Lawine kommen, die zu einem dramatischen Anstieg des Datenbankdrucks führt.
Lösung für den Fall, dass eine große Datenmenge gleichzeitig abläuft
Um das Problem zu lösen, dass eine große Datenmenge gleichzeitig abläuft, gibt es normalerweise zwei Lösungen:
- Erhöhen Sie den Zufall Zeit in der Datenablaufeinstellung: Das heißt, wenn Sie den Ablaufbefehl verwenden, um die Ablaufzeit für die Daten festzulegen, fügen Sie eine zufällige Zeit hinzu, z. B. laufen Daten a in 5 Minuten ab und 10-120 Sekunden werden zufällig zu den 5 hinzugefügt Minuten. Dadurch wird verhindert, dass große Datenmengen gleichzeitig ablaufen.
- Dienstverschlechterung: Das heißt, wenn eine Cache-Lawine auftritt, (1) wenn der Zugriff nicht auf Kerndaten erfolgt und kein Cache-Treffer vorliegt, wird die Datenbank nicht auf die Datenbank zugreifen und voreingestellte Informationen wie Nullwerte eingeben oder Fehlermeldungen werden direkt zurückgegeben. (2) Wenn auf Kerndaten zugegriffen wird und der Cache fehlschlägt, ist eine Datenbankabfrage zulässig. Auf diese Weise werden Anfragen, die keine Kerndaten sind, abgelehnt und an die Datenbank gesendet.
Nachdem wir uns die Situation angesehen haben, in der eine große Datenmenge gleichzeitig abläuft, werfen wir einen Blick auf die Situation des Ausfalls einer Redis-Cache-Instanz.
Cache-Lawine durch Redis-Cache-Instanzfehler verursacht
In diesem Fall kann Redis die Leseanforderung nicht verarbeiten und die Anforderung wird natürlich an die Datenbank weitergeleitet.
Generell haben wir zwei Möglichkeiten, mit dieser Situation umzugehen:
- Leistungsschalter warten/Strombegrenzung anfordern im Geschäftssystem.
Vorsichtsmaßnahme im Voraus: Erstellen Sie einen hochzuverlässigen Redis-Cluster, - z. B. Master-Slave-Cluster-Switching.
Service-Leistungsschalter, das heißt, wenn Redis ausfällt, werden Zugriffsanfragen auf das Cache-System ausgesetzt. Warten Sie, bis Redis wieder normal ist, bevor Sie die Zugriffsanforderung öffnen.
Auf diese Weise müssen wir den Betriebsstatus von Redis oder der Datenbank überwachen, z. B. den Lastdruck von MySQL, die CPU-Auslastung von Redis, die Speichernutzung und QPS usw. Wenn festgestellt wird, dass der Redis-Instanzcache zusammengebrochen ist, wird der Dienst angehalten.
Diese Situation kann effektiv zu einer großen Anzahl von Anfragen führen und Druck auf die Datenbank ausüben. Allerdings werden Zugriffsanfragen ausgesetzt, was große Auswirkungen auf das Unternehmen haben wird.
Um die Auswirkungen auf die Geschäftsseite zu reduzieren, können wir daher die Anforderungsstrombegrenzung verwenden, um QPS zu steuern und zu viele Anfragen an die Datenbank zu vermeiden. In der folgenden Abbildung gibt es beispielsweise 20.000 Anfragen pro Sekunde, die jedoch aufgrund eines Redis-Fehlers ausfielen. Unser aktueller Begrenzungsvorgang hat die QPS auf 2.000 pro Sekunde reduziert, und die Datenbank hat immer noch kein Problem damit, 2.000 QPS zu verarbeiten.
Cache-Aufschlüsselung
Cache-Aufschlüsselung bedeutet, dass einzelne Hotspot-Daten, auf die häufig zugegriffen wird, nicht zwischengespeichert werden können und dann Anfragen in die Datenbank fließen. Dies passiert häufig, wenn Hotspot-Daten ablaufen.
In Bezug auf das Problem der Cache-Aufschlüsselung wissen wir, dass es sich um heiße Daten handelt, auf die sehr häufig zugegriffen wird. Daher ist die Verarbeitungsmethode einfach und grob und die Ablaufzeit wird nicht direkt festgelegt. Warten Sie einfach, bis auf die Hotspot-Daten nicht mehr häufig zugegriffen wird, und bearbeiten Sie sie dann manuell.
Cache-Penetration
Cache-Avalanche ist etwas Besonderes, es bedeutet, dass sich die Daten, auf die zugegriffen werden soll, weder im Redis-Cache noch in der Datenbank befinden. Wenn eine große Anzahl von Anfragen in das System eingeht, stehen Redis und die Datenbank unter enormem Druck.
Es gibt normalerweise zwei Gründe für das Eindringen in den Cache:
- Die Daten werden versehentlich gelöscht, was dazu führt, dass keine Daten im Cache und in der Datenbank vorhanden sind. Der Kunde weiß das jedoch nicht und fragt trotzdem hektisch nach.
- Es gibt Fälle von böswilligen Angriffen: Das heißt, jemand zielt auf Sie ab, um nach Daten zu suchen, die nicht verfügbar sind.
Für die Cache-Penetration können Sie auf die folgenden Lösungen zurückgreifen:
-
besteht darin, einen Nullwert oder einen Standardwert für den Cache festzulegen. Wenn beispielsweise eine Cache-Penetration auftritt, legen Sie im Redis-Cache einen Nullwert/Standardwert fest. Nachfolgende Abfragen für diesen Wert geben diesen Standardwert direkt zurück.
- Verwenden Sie den Bloom-Filter, um festzustellen, ob Daten vorhanden sind, und um Abfragen aus der Datenbank zu vermeiden.
-
Führen Sie die Anforderungserkennung im Frontend durch. Filtern Sie beispielsweise einige illegale Anfragen direkt im Frontend, anstatt sie zur Verarbeitung an das Backend zu senden.
Der erste und dritte Punkt sind leichter zu verstehen und werden hier nicht beschrieben. Konzentrieren wir uns auf den zweiten Punkt: Bloom-Filter.
Bloom-Filter
Der Bloom-Filter wird hauptsächlich verwendet, um festzustellen, ob ein Element in einer Menge enthalten ist. Es besteht aus einem binären Vektor fester Größe (kann als Bitarray mit dem Standardwert 0 verstanden werden) und einer Reihe von Zuordnungsfunktionen.
Sehen wir uns zunächst an, wie der Bloom-Filter Daten als a markiert:
- Im ersten Schritt werden mehrere Zuordnungsfunktionen (Hash-Funktionen) verwendet, und jede Funktion berechnet den Hash des Daten-a-Werts
- Im zweiten Schritt werden diese berechneten Hash-Werte jeweils der Länge des Bit-Arrays angepasst, um die Position jedes Hash-Werts im Array zu erhalten.
- Im dritten Schritt werden die Positionen ermittelt jeweils im Bit-Array auf 1 gesetzt.
Mit diesen 3 Schritten ist die Datenkennzeichnung abgeschlossen. Um die Daten dann abzufragen, wenn sie nicht vorhanden sind, gehen Sie wie folgt vor:
- Berechnen Sie zunächst die mehreren Positionen dieser Daten im Bit-Array.
- Überprüfen Sie dann jeweils die Bitwerte dieser Positionen im Bit-Array. Nur wenn der Bitwert jeder Position 1 ist, bedeutet dies, dass die Daten vorhanden sein dürfen, andernfalls dürfen die Daten nicht vorhanden sein.
Wenn man sich das Bild unten ansieht, sieht das Grundprinzip so aus.
Empfohlenes Lernen: Redis-Video-Tutorial
Das obige ist der detaillierte Inhalt vonErfahren Sie in einem Artikel mehr über Redis-Cache-Lawine, Cache-Aufschlüsselung und Cache-Penetration. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!