]Im vorherigen Artikel haben wir hauptsächlich über einige Grundkenntnisse von Redis gesprochen. In der Praxis sind keine tatsächlichen Kämpfe aufgetreten. Heute werde ich über tatsächliche Kämpfe sprechen. „Cache-Lawine“ Mein Eindruck ist, dass diese drei Fragen auch häufig in Vorstellungsgesprächen gestellt werden, aber um diese Fragen klar erklären zu können, sind Fähigkeiten erforderlich. [Verwandte Empfehlungen:
Redis-Video-Tutorial
Zunächst werden Sie im Code feststellen, ob es sich um Tomcat oder Ihren RPC-Dienst handelt. Wenn die gewünschten Daten im Cache gespeichert sind, werden sie direkt an das aufrufende Ende zurückgegeben . Wenn es nicht vorhanden ist, müssen Sie die Datenbank abfragen, sie weiterhin im Cache speichern und die Ergebnisse dann an den Aufrufer zurückgeben.
Cache-LawineDefinition
Ich erinnere mich, dass einige Daten von Offline-Algorithmen berechnet wurden, nachdem ich dieses Produkt gesehen hatte hbase und gleichzeitig in Redis gespeichert. Da sie alle durch einen Batch-Algorithmus generiert werden, wird bei gleicher Ablaufzeit eine große Anzahl von Schlüsseln gleichzeitig ungültig Dann wird eine große Anzahl von Schlüsseln an die Hintergrunddatenbank gesendet. Da der Durchsatz der Datenbank begrenzt ist, ist es sehr wahrscheinlich, dass die Datenbank herunterfällt. Schauen Sie sich das Bild an Um zu sprechen:achten.
So verhindern Sie LawinenWenn Sie die Cache-Zeit stapelweise festlegen, legen Sie eine Zufallszahl für die eingestellte Cache-Zeit fest (die Zufallszahl kann beispielsweise eine Zahl innerhalb von 10 Minuten sein). , eine Zufallszahl. Die Generierung kann mit Javas Random generiert werden, sodass nicht eine große Anzahl von Schlüsseln gleichzeitig erscheint und kollektiv fehlschlägt. Schauen Sie sich das Bild an und sprechen Sie:
Was tun, wenn ein Kommt es wirklich zu einer Lawine?
Der Verkehr ist nicht sehr groß, die Datenbank hält dem stand, ok, Glückwunsch zum Entkommen.
Der Datenverkehr ist sehr groß und überschreitet die Anzahl der Anfragen, die die Datenbank verarbeiten kann. Herzlichen Glückwunsch zum Erhalt eines P0-Vorfallstickets.
Der Datenverkehr ist sehr groß. Wenn Ihre Datenbank über ein Strombegrenzungsschema verfügt, wird die Anfrage abgelehnt, wenn die Strombegrenzungsparameter erreicht sind, wodurch die Hintergrunddatenbank geschützt wird. Hier ein paar Worte zur Strombegrenzung.
Sie können die große Anzahl von Anfragen, die das Datenbankende erreichen, begrenzen, indem Sie die Anzahl der Anfragen pro Sekunde festlegen. Beachten Sie, dass die Anzahl der Anfragen pro Sekunde oder die Anzahl der Parallelität hier nicht der aktuellen Anzahl der Anfragen pro Sekunde für entspricht Es kann festgelegt werden, dass eine bestimmte Anzahl von Anfragen pro Sekunde abgefragt wird. Der Zweck besteht darin, zu verhindern, dass eine große Anzahl von Anfragen mit demselben Schlüssel die Back-End-Datenbank erreicht abgefangen werden kann.Schauen Sie sich das Bild an und sprechen Sie:
Auf diese Weise werden die meisten Anfragen für denselben Schlüssel begrenzt, wodurch die Datenbank-Datenbank geschützt wird.
Tatsächlich wird die Strombegrenzung in zwei Arten unterteilt: lokale Strombegrenzung und verteilte Strombegrenzung. In den folgenden Artikeln werde ich die von Redis implementierte lokale Strombegrenzung und verteilte Strombegrenzung vorstellen.
Cache-AufschlüsselungDefinition
Wenn eine Website beispielsweise Double Eleven oder Flash-Verkäufe und andere betriebliche Aktivitäten durchführt, ist der Website-Verkehr zu diesem Zeitpunkt im Allgemeinen sehr groß, und ein bestimmtes Produkt wird dies tun Aufgrund der Werbung wird es zu einem heißen Produkt und der Datenverkehr wird sehr groß sein. Wenn dieses Produkt aus irgendeinem Grund zu diesem Zeitpunkt im Cache ausfällt, fließt der Datenverkehr dieses Schlüssels sofort in die Datenbank. und die Datenbank wird irgendwann nicht mehr überleben können, die Konsequenzen können normalerweise nicht abgefragt werden. Schauen Sie sich das Bild an und sprechen Sie:Der Huawei Pro-Schlüssel in Redis ist möglicherweise abgelaufen oder wurde aufgrund von unzureichendem Speicher entfernt Redis, und es wurde festgestellt, dass Redis nicht über diesen Schlüssel verfügt, der Datenverkehr wird an die Datenbank übertragen, um das entsprechende Huawei Pro abzufragen. Zu diesem Zeitpunkt kann die Datenbank es nicht mehr ertragen und fällt aus.
So lösen Sie das Problem
Tatsächlich reicht es letzten Endes aus, nicht zuzulassen, dass mehr Verkehr die DB erreicht, also müssen wir nur den Verkehr zur DB begrenzen.
1. Die aktuelle Begrenzung
ähnelt dem, was oben erwähnt wurde. Wenn dieser Schlüssel durchdrungen wird, wird nur ein Datenverkehr auf die Datenbank beschränkt, und die anderen werden abgelehnt Warten Sie auf eine erneute Operation. Versuchen Sie, Redis abzufragen.
Das Strombegrenzungsdiagramm finden Sie im Diagramm zur Strombegrenzung bei Cache-Ausfall.
Auch dies wird in lokale Strombegrenzung und verteilte Strombegrenzung unterteilt.
Was bedeutet lokale Strombegrenzung? Es bedeutet, den Datenverkehr dieses Schlüssels innerhalb einer einzelnen lokalen Instanz zu begrenzen.
Was ist eine verteilte Strombegrenzung? Das bedeutet, dass in einer verteilten Umgebung im Bereich mehrerer Instanzen das kumulative Verkehrslimit dieses Schlüssels der Verkehr von mehreren Instanzen ist DB.
2. Verwenden Sie verteilte Sperren
Hier finden Sie eine kurze Einführung in die Definition verteilter Sperren. In gleichzeitigen Szenarien müssen Sperren verwendet werden, um sich gegenseitig auszuschließen, um Thread-Sicherheit zu gewährleisten Außerdem ist ein Mechanismus erforderlich, um den gegenseitigen ausschließlichen Zugriff auf gemeinsam genutzte Ressourcen mit mehreren Knoten sicherzustellen, und der Implementierungsmechanismus besteht aus verteilten Sperren.
Die gemeinsam genutzte Ressource ist hier im Beispiel Huawei Pro. Das heißt, beim Zugriff auf Huawei Pro in der Datenbank muss sichergestellt werden, dass nur auf einen Thread oder einen Fluss zugegriffen wird, um den Effekt einer verteilten Sperre zu erzielen.
Schauen Sie sich das Bild an und sprechen Sie:
Gehen Sie, um das Schloss zu holen:
Nachdem eine große Anzahl von Anfragen den Wert des Huawei Pro-Schlüssels nicht erhalten hat, sind sie bereit, zur Datenbank zu gehen, um den zu erhalten Zu diesem Zeitpunkt fügt der Code zum Abrufen der Datenbank eine verteilte Sperre hinzu. Anschließend erhält jede Anfrage und jeder Thread die verteilte Sperre von Huawei Pro (in der Abbildung wird die verteilte Sperre mithilfe von Redis implementiert). Ich werde später einen separaten Artikel veröffentlichen Einführung der Implementierung einer verteilten Sperre, die nicht auf Redis beschränkt ist.
Nach dem Erwerb der Sperre:
Zu diesem Zeitpunkt erhält Thread A die verteilte Sperre von Huawei Pro, dann geht Thread A in die Datenbank, um Daten zu laden, und dann legt Thread A Huawei Pro erneut in den Cache. und dann die Daten zurückgeben.
Andere Threads haben es nicht erhalten, einen Nullwert direkt an den Client zurückzugeben, und eine andere Möglichkeit besteht darin, 50-100 ms zu warten, da das Abfragen der Datenbank und das Einfügen in Redis sehr schnell geht Wenn nicht, wird das Ergebnis erneut zurückgegeben. Natürlich können Sie es auch in großen Parallelitätsszenarien erneut versuchen viele Wiederholungsversuche.
3. Geplante Aufgaben aktualisieren Hotspot-Schlüssel
Das ist leicht zu verstehen: Es handelt sich um eine geplante Aufgabe, die regelmäßig die Zeitüberschreitung bestimmter Hotspot-Schlüssel überwacht und dann die Aktualisierung durchführt Wenn es bald abläuft, verlängern Sie einfach die Cache-Zeit des Schlüssels im Cache.
Überprüfen und aktualisieren Sie die Ablaufzeit mit Single-Thread-Polling, siehe Bild:
Multi-Threading-Methode, bitte beachten Sie, dass es nicht zu viele Hotspot-Schlüssel geben sollte, da ein bestimmter Thread ggf. viele öffnet Es gibt viele Hotspot-Schlüssel. Sie können die Thread-Pool-Methode verwenden, siehe Bild:
Implementierung der Verzögerungswarteschlange
Die obige Methode drückt es ganz klar aus: Unabhängig davon, ob es sich um einen einzelnen Thread oder mehrere Threads handelt, erfolgt eine Abfrage Wird verwendet (jedes Mal umsonst CPU-Verschwendung), um zu prüfen, ob der Schlüssel bald abläuft, was zu Zeitverzögerungen oder Ungenauigkeiten führen kann Dann ist es zu diesem Zeitpunkt bereits zu einem Ausfall gekommen, aber wie können wir ihn tatsächlich vermeiden? Ich werde hier nicht näher auf diese Warteschlange eingehen. Sie können Baidu oder Google verwenden. Die sogenannte Verzögerungswarteschlange besteht darin, Nachrichten an diese Warteschlange zu senden, in der Hoffnung, sie entsprechend der von Ihnen festgelegten Zeit zu verbrauchen fertig, bevor die Zeit abgelaufen ist, und der Verbrauch wird erledigt sein, wenn die Zeit abgelaufen ist. Okay. Lassen Sie uns darüber sprechen, indem wir uns die Bilder ansehen:
1. Wenn das Programm zum ersten Mal gestartet wird, ist die Ablaufzeit der Schlüssel in der Liste wird erhalten.
2. Stellen Sie die Verbrauchszeit der Tasten nacheinander ein. Beachten Sie, dass die Verbrauchszeit vor der Ablaufzeit liegt.
3. Verzögern Sie den Ablauf der Warteschlange und die Verbraucherseite verbraucht den Schlüssel.
4. Der Verbraucher verbraucht Nachrichten und verzögert die Ablaufzeit des Schlüssels zum Cache.
5. Senden Sie die neue Schlüsselablaufzeit erneut an die Verzögerungswarteschlange und warten Sie auf die nächste Ablaufzeit des verzögerten Caches.
4. Das Festlegen des Schlüssels läuft nicht ab
Der Schlüssel kann tatsächlich aufgrund unzureichenden Speichers entfernt werden. Sie können über die Umstände nachdenken, unter denen der Schlüssel entfernt wird.
Definition
Die sogenannte Penetration besteht darin, auf einen Schlüssel zuzugreifen, der nicht im Cache oder in der Datenbank vorhanden ist. Zu diesem Zeitpunkt erreicht der Datenverkehr direkt die Datenbank und dann einige Schurken Sie können diese Schwachstelle ausnutzen und Ihre Schnittstelle verrückt flashen, wodurch Ihre Datenbank zerstört wird und Ihr Unternehmen nicht mehr normal laufen kann.
Wie kann man es lösen?
1. Null- oder Sonderwert festlegen
Wir können den Null- oder Sonderwert ohne Ablaufdatum festlegen.
Diese Lösung kann das grundlegende Problem nicht lösen. Wenn dieser Datenverkehr eine große Anzahl nutzloser Schlüssel fälschen kann, ist er nutzlos, egal wie viele Nullen oder Sonderwerte Sie festlegen.
2. Bloom-Filter
Bloom-Filter wird auf Englisch nur kurz vorgestellt. Aus Platzgründen wird es später einen separaten Artikel geben.
Wenn unsere Datenbank beispielsweise zig Millionen SKU-Daten speichert, besteht unsere aktuelle Anforderung darin, Redis abzufragen, wenn Redis nicht vorhanden ist, und dann Redis zu aktualisieren Denken Sie daran, die SKU-Daten in eine Hashmap einzufügen, und der Schlüssel ist SKU. Da es viele SKUs gibt, ist der von dieser Hashmap belegte Speicherplatz sehr groß und kann letztendlich den Speicher sprengen Wie man also Speicher spart, können wir ein Bit-Array verwenden, um den Status zu speichern, ob die SKU vorhanden ist, und 1 die Existenz darstellt. Wir können eine Hash-Funktion verwenden, um den Hash-Wert der SKU zu berechnen Extrahieren Sie dann den Hash-Wert von sku aus dem Bit-Array, ermitteln Sie die Position des Arrays und setzen Sie ihn dann auf 1. Wenn die Anforderung eintrifft, berechnen wir, ob die Array-Position, die dem sku-Hash-Wert entspricht, 1 ist . Wenn es 1 ist, bedeutet es, dass es existiert, und wenn es 0 ist, bedeutet es, dass es nicht existiert. Ein solcher einfacher Bloomfilter hat eine Fehlerrate. Sie können die Array-Länge und die Anzahl der Hash-Funktionen erhöhen, um die Genauigkeit zu gewährleisten. Darüber werde ich heute nicht sprechen.
Sehen wir uns den Prozess der Verwendung von Bloomfiler an, um das Eindringen in den Cache zu verhindern. Schauen Sie sich das Bild an:
Die Initialisierung von Bloomfiler kann die Datenbank über eine geplante Aufgabe lesen und die Größe des Bit-Arrays initialisieren ist 0, was bedeutet, dass es nicht existiert. Berechnen Sie dann die Array-Position, die dem Hash-Wert für jedes Element entspricht, und fügen Sie ihn dann in das Bit-Array ein.
Anfrageprozess, siehe Bild:
Wenn Sie den Bloomfiler-Filter nicht verwenden, verschwenden Sie für einen Schlüssel, der nicht in der Datenbank vorhanden ist, tatsächlich zwei IOs, einen zum Abfragen von Redis und einen eine zum Abfragen der Datenbank. Ohne Bloomfiler werden diese beiden nutzlosen E/As eingespart und die Verschwendung von Back-End-Redis- und DB-Ressourcen wird reduziert.
Heute haben wir über die Probleme und Lösungen gesprochen, die bei Hochfrequenzinterviews und im tatsächlichen Kampf gegen den Redis-Cache auftreten.
Cache-Lawine
Lösung:
Fügen Sie beim Festlegen der Ablaufzeit eine zufällige Zeitspanne hinzu, die innerhalb weniger Minuten liegen kann.
Neben der Frage, was im Lawinenfall zu tun ist, kann auch eine Strombegrenzung eingesetzt werden.
Cache-Aufschlüsselung
Lösung:
Strombegrenzung
Verteilte Sperre
Aktualisieren Sie die Hotspot-Schlüssel regelmäßig. Hier konzentrieren wir uns auf die Verzögerungswarteschlange.
Zeit ohne Ablauf festlegen
Cache-Penetration
Lösung:
Null oder einen bestimmten Wert für Redis festlegen
Verwenden Sie Bloomfiler, um
Weitere Programmierkenntnisse finden Sie unter :Einführung in die Programmierung! !
Das obige ist der detaillierte Inhalt vonLassen Sie uns über Cache-Lawine, Cache-Aufschlüsselung und Cache-Penetration in Redis sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!