Heim  >  Artikel  >  Datenbank  >  Umgang mit drei großen Ausnahmen im Redis-Cache

Umgang mit drei großen Ausnahmen im Redis-Cache

WBOY
WBOYnach vorne
2023-05-27 11:28:331039Durchsuche

    1. Hintergrund

    Redis ist vollständig Open Source und entspricht dem BSD-Protokoll ., ein leistungsstarkes Schlüsselwert-Datenstrukturspeichersystem, das die Datenpersistenz unterstützt und Daten im Speicher auf der Festplatte speichern kann. Es unterstützt nicht nur einfache Schlüsselwerttypdaten, sondern bietet auch Listen-, Satz- und Datenstrukturspeicherung Wie zset und hash ist Redis auch sehr leistungsfähig und unterstützt auch die Datensicherung, also die Datensicherung im Master-Slave-Modus, wodurch die Verfügbarkeit verbessert wird. Die schnelle Lese- und Schreibgeschwindigkeit ist am kritischsten, da sie als am häufigsten verwendete Caching-Lösung in unserer täglichen Entwicklung weit verbreitet ist. Im tatsächlichen Anwendungsprozess kann es jedoch zu ungewöhnlichen Situationen wie Cache-Lawine, Cache-Ausfall und Cache-Penetration kommen. Wenn diese Situationen ignoriert werden, werden im Folgenden hauptsächlich diese Cache-Ausnahmen und allgemeine Verarbeitungslösungen analysiert .

    2. Cache-Lawine

    (1) Was ist

    , das für a im Redis-Cache sein sollte Zeitspanne Eine große Anzahl von Anfragen wird zur Verarbeitung an die Datenbank gesendet, wodurch der Druck auf die Datenbank rapide zunimmt. In schweren Fällen kann es sogar zum Absturz der Datenbank kommen, wodurch das gesamte System wie bei einer Lawine zusammenbricht , was einen Ketteneffekt auslöst, daher spricht man von einer Cache-Lawine.

    (2) Warum

    Die häufigsten Gründe für die obige Situation sind hauptsächlich die folgenden zwei Punkte:

      #🎜 🎜#
    • Eine große Menge zwischengespeicherter Daten läuft gleichzeitig ab, was dazu führt, dass Daten, die aus dem Cache hätten angefordert werden sollen, erneut aus der Datenbank abgerufen werden müssen.

    • Wenn Redis selbst ausfällt und die Anfrage nicht verarbeiten kann, wird die Anfrage natürlich an die Datenbank gesendet.

    (3) Was zu tun ist

    Für den Fall, dass eine große Menge zwischengespeicherter Daten gleichzeitig abläuft:

    • Wenn Sie die Ablaufzeit tatsächlich festlegen, sollten Sie versuchen, das Szenario zu vermeiden, in dem eine große Anzahl von Schlüsseln gleichzeitig abläuft Legen Sie die Ablaufzeit durch Randomisierung, Feinabstimmung und sogar Einstellungen fest, um zu vermeiden, dass sie gleichzeitig abläuft.

    • Fügen Sie eine Mutex-Sperre hinzu, damit die Vorgänge zum Erstellen des Caches nicht gleichzeitig ausgeführt werden.

    • Doppelschlüsselstrategie: Der Primärschlüssel ist der Originalcache und der Sicherungsschlüssel ist der Kopiercache. Wenn der Primärschlüssel ausfällt, kann auf den Sicherungsschlüssel zugegriffen werden. und die Cache-Ablaufzeit des Primärschlüssels ist auf kurzfristig eingestellt, der Sicherungsschlüssel ist auf langfristig eingestellt.

    • Strategie für die Hintergrundaktualisierung des Caches, Verwendung geplanter Aufgaben oder Nachrichtenwarteschlangen zum Aktualisieren oder Entfernen des Redis-Cache usw.

    Als Reaktion auf das Scheitern von Redis selbst:

    • In Prävention Auf der gleichen Ebene kann ein Hochverfügbarkeitscluster über Master-Slave-Knoten aufgebaut werden, was bedeutet, dass nach dem Auflegen der Master-Redis-Instanz andere Slave-Bibliotheken schnell zur Master-Bibliothek wechseln und weiterhin Dienste bereitstellen können.

    • Sobald ein Ereignis eintritt, kann ein Service-Schutzschalter oder eine Strategie zur Begrenzung des Anforderungsstroms eingeführt werden, um zu verhindern, dass die Datenbank aufgrund zu vieler Anforderungen abstürzt. Natürlich ist der Service-Leistungsschalter relativ grob und stoppt den Dienst, bis der Redis-Dienst wiederhergestellt ist, und die Anforderungsstrombegrenzung ist relativ gering, um sicherzustellen, dass einige Anforderungen verarbeitet werden können. Dies ist kein einheitlicher Ansatz , aber es ist immer noch notwendig, eine geeignete Lösung basierend auf der spezifischen Geschäftssituation auszuwählen.

    3. Cache-Aufschlüsselung

    (1) Was ist

    Cache? In Systemen mit hoher Parallelität tritt im Allgemeinen ein Zusammenbruch auf, wenn eine große Anzahl gleichzeitiger Benutzer gleichzeitig Daten anfordert, die sich nicht im Cache, sondern in der Datenbank befinden. Das heißt, sie lesen den Cache, lesen die Daten jedoch nicht gleichzeitig Gehen Sie gleichzeitig zur Datenbank, um die Daten abzurufen, was zu einem sofortigen Druckanstieg auf die Datenbank führt. Im Gegensatz zur Cache-Lawine bezieht sich die Cache-Aufschlüsselung auf die gleichzeitige Abfrage derselben Daten. Cache-Lawine bedeutet, dass unterschiedliche Daten abgelaufen sind und viele Daten nicht gefunden werden können, sodass die Datenbank durchsucht wird.

    (2) Warum

    Tatsächlich ist der allgemeine Grund für diese Situation, dass ein bestimmter Hotspot-Datencache abläuft. Da es sich um Hotspot-Daten handelt, beträgt die Anzahl gleichzeitiger Anfragen groß, also abgelaufen. Manchmal gehen immer noch viele Anfragen gleichzeitig ein und alle erreichen die Datenbank, bevor der Cache aktualisiert werden kann.

    (3) Was zu tun ist

    Es gibt zwei gängige Lösungen für diese Situation:

    # 🎜🎜 #
      Legen Sie einfach und grob keine Ablaufzeit für die Hotspot-Daten fest, damit diese nicht ablaufen und die oben genannte Situation natürlich nicht auftritt. Wenn Sie sie später bereinigen möchten, können Sie dies über tun Hintergrund.
    • Fügen Sie eine Mutex-Sperre hinzu. Wenn sie abläuft, kann die Sperranforderung mit Ausnahme der ersten Abfrageanforderung aus der Datenbank abgerufen und erneut im Cache aktualisiert werden . Andere werden blockiert, bis die Sperre aufgehoben wird, und nachfolgende Anforderungen werden an den Cache gestellt, sodass es nicht zu einem Cache-Ausfall kommt.

    4. Cache-Penetration

    (1) Was ist

    Cache-Penetration? dass sich die Daten weder in Redis noch in der Datenbank befinden. Dies bedeutet, dass bei jeder Anfrage die Datenbank erneut abgefragt werden muss, nachdem der entsprechende Schlüssel nicht im Cache gefunden wurde hat es nicht, was gleichbedeutend mit Es wurden zwei nutzlose Abfragen gestellt. Auf diese Weise können Anfragen den Cache umgehen und die Datenbank direkt überprüfen. Wenn jemand zu diesem Zeitpunkt das System böswillig angreifen möchte, kann er absichtlich Nullwerte oder andere nicht vorhandene Werte verwenden, um häufige Anfragen zu stellen Üben Sie einen größeren Druck auf die Datenbank aus.

    (2) Warum

    Der Grund für dieses Phänomen liegt tatsächlich in der Geschäftslogik, wenn der Benutzer keine entsprechenden Vorgänge oder Verarbeitungen für bestimmte Informationen durchgeführt hat , dann das entsprechende Natürlich gibt es keine entsprechenden Daten in der Datenbank oder im Cache, in denen die Informationen gespeichert sind, und es besteht die Gefahr, dass die oben genannten Probleme auftreten.

    (3) Was ist zu tun? 🎜#

    Die Beschränkungen für illegale Anfragen beziehen sich hauptsächlich auf Parameterüberprüfung, Authentifizierungsüberprüfung usw., um eine große Anzahl illegaler Anfragen von Anfang an abzufangen, was ein notwendiges Mittel für die tatsächliche Geschäftsentwicklung ist.

    Leere Werte oder Standardwerte zwischenspeichern Wenn die Daten, die nicht aus dem Cache abgerufen werden können, nicht in der Datenbank abgerufen werden, werden die leeren Ergebnisse trotzdem zwischengespeichert . Stellen Sie außerdem eine kürzere Ablaufzeit ein. Der Standardwert dieser Einstellung wird im Cache gespeichert, sodass der Wert beim zweiten Mal im Cache abgerufen wird, ohne dass weiterhin auf die Datenbank zugegriffen werden muss. Dadurch kann verhindert werden, dass eine große Anzahl böswilliger Anforderungen wiederholt denselben Schlüssel für Angriffe verwendet.
    • Verwenden Sie den Bloom-Filter, um schnell festzustellen, ob Daten vorhanden sind. Was ist also ein Bloom-Filter? Vereinfacht gesagt kann er mehrere unabhängige Hash-Funktionen einführen, um sicherzustellen, dass die Bestimmung des Elementgewichts innerhalb eines bestimmten Raums und einer bestimmten Fehleinschätzungsrate abgeschlossen wird. Da wir wissen, dass eine Hash-Kollision vorliegt, erhöht sich die Wahrscheinlichkeit einer Kollision offensichtlich, wenn nur eine Hash-Funktion verwendet wird. Um diesen Konflikt zu reduzieren, können wir mehrere weitere Hash-Funktionen und die Bloom-Filterung einführen Der Kern des Hash-Algorithmus besteht darin, mehrere verschiedene Hash-Funktionen zu verwenden, um einen solchen Konflikt zu lösen. Seine Vorteile sind eine hohe Speicherplatzeffizienz und eine kurze Abfragezeit, die weit über denen anderer Algorithmen liegt. Sein Nachteil besteht darin, dass es eine gewisse Fehlerkennungsrate gibt. Es kann nicht vollständig garantiert werden, dass der angeforderte Schlüssel die Überprüfung des Bloom-Filters besteht Alles in allem wird es theoretisch immer noch Konflikte geben, egal wie gering die Wahrscheinlichkeit ist. Solange er jedoch die Überprüfung des Bloom-Filters nicht besteht, darf der Schlüssel nicht vorhanden sein. Solange dieser verwendet wird, können Sie tatsächlich die meisten Anfragen für nicht vorhandene Schlüssel herausfiltern, was in normalen Szenarien ausreicht.
    • 5. Andere
    • Zusätzlich zu den oben genannten drei häufigen Redis-Cache-Ausnahmeproblemen gibt es auch Häufig habe ich die Begriffe „Cache-Aufwärmen“ und „Cache-Downgrade“ gehört, bei denen es sich weniger um ungewöhnliche Probleme als vielmehr um zwei Optimierungsmethoden handelt.
    (1) Cache-Vorwärmung

    Bevor und nachdem das System online geht, lädt die Cache-Vorwärmung relevante Cache-Daten direkt in das Cache-System, ohne auf Benutzervorgänge angewiesen zu sein. Dadurch kann das Problem vermieden werden, zuerst die Datenbank abzufragen und dann die Daten zwischenzuspeichern, wenn der Benutzer sie anfordert. Benutzer fragen direkt die im Voraus vorgewärmten zwischengespeicherten Daten ab. Dadurch kann vermieden werden, dass in den frühen Phasen des Systemstarts ein hoher Parallelitätsverkehr auf die Datenbank zugreift, was zu einer Belastung der Datenbank führt.

    Entsprechend den unterschiedlichen Größenordnungen der Daten gibt es mehrere Ansätze:

    data Die Menge ist nicht groß: wird automatisch geladen, wenn das Projekt gestartet wird.

    • Große Datenmenge: Aktualisieren Sie den Cache regelmäßig im Hintergrund.

    • Die Datenmenge ist riesig: Führen Sie Vorlade-Cache-Vorgänge nur für heiße Daten durch.

    • (2) Cache-Downgrade

      Cache-Downgrade bezieht sich auf den Fall, dass der Cache ausfällt oder ein Problem mit dem Cache-Dienst vorliegt Verhindern Sie, dass der Cache-Dienst ausfällt, was zu einem Lawinenproblem in der Datenbank führt, sodass ich nicht auf die Datenbank zugreifen kann. Aus bestimmten Gründen möchte ich jedoch weiterhin sicherstellen, dass der Dienst grundsätzlich verfügbar ist, obwohl dies definitiv ein Verlust wäre des Dienstes. Daher können wir für unwichtige zwischengespeicherte Daten eine Strategie zur Dienstverschlechterung anwenden.

    • Es gibt zwei allgemeine Methoden:

    Greifen Sie direkt auf den Datencache im Speicherteil zu.

    Kehrt direkt zum vom System festgelegten Standardwert zurück.

    Das obige ist der detaillierte Inhalt vonUmgang mit drei großen Ausnahmen im Redis-Cache. 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