


Lassen Sie uns gemeinsam die Redis-Cache-Konsistenz, Cache-Penetration, Cache-Aufschlüsselung und Cache-Avalanche-Probleme analysieren
Dieser Artikel bringt Ihnen relevantes Wissen über Redis, das hauptsächlich Probleme im Zusammenhang mit Cache-Konsistenz, Cache-Penetration, Cache-Aufschlüsselung, Cache-Lawine und Schreibsynchronisation zwischengespeicherter Daten und DB-Konsistenz behandelt wird für alle hilfreich sein.
Verwandte Empfehlungen: „Analyse von Hotkey-Speicherproblemen in Redis und Diskussion über Lösungen für Cache-Ausnahmen“
(1) Cache-Invalidierungskonsistenzproblem
Allgemeine Cache-Nutzung ist: Lesen Sie die Wenn der Cache nicht vorhanden ist, lesen Sie ihn zuerst aus der Datenbank und schreiben Sie das Ergebnis in den Cache. Wenn die Daten das nächste Mal gelesen werden, können die Daten direkt aus dem Cache abgerufen werden. [Verwandte Empfehlung: Redis-Video-Tutorial]
Bei der Datenänderung werden die zwischengespeicherten Daten direkt ungültig gemacht und dann der DB-Inhalt geändert, um eine erfolgreiche DB-Änderung zu vermeiden. Die zwischengespeicherten Daten werden jedoch aufgrund von Netzwerk- oder anderen Problemen nicht bereinigt, was dazu führt schmutzige Daten. Dies kann jedoch immer noch nicht verhindern, dass schmutzige Daten generiert werden. In einem gleichzeitigen Szenario: Gehen Sie davon aus, dass das Unternehmen eine große Anzahl von Lese- und Änderungsanforderungen für die Daten Key:Hello Value:World hat. Thread A liest „Key:Hello“ von OCS, ruft das Ergebnis „Not Found“ ab, beginnt mit der Datenanforderung von der Datenbank und ruft als Nächstes die Daten „Key:Hello Value:World“ ab. Anschließend bereitet er das Schreiben dieser Daten in OCS vor, jedoch vor dem Schreiben in OCS (Netzwerk). , Das Warten auf die CPU kann dazu führen, dass sich die Verarbeitungsgeschwindigkeit von Thread A verlangsamt.) Ein anderer Thread B fordert eine Änderung der Daten an. Schlüssel:Hallo Wert:OCS und führt zuerst die Invalidierungs-Cache-Aktion aus (da Thread B nicht weiß, ob diese Daten vorhanden sind). , sodass der Invalidierungsvorgang direkt ausgeführt wird. OCS hat die ungültige Anfrage erfolgreich verarbeitet. Kehren Sie zu Thread A zurück, um mit dem Schreiben von OCS fortzufahren und Key:Hello Value:World in den Cache zu schreiben. Thread B hat auch den DB-Dateninhalt erfolgreich in Key:Hello Value:OCS geändert. Um dieses Problem zu lösen, hat OCS das Memcached-Protokoll erweitert (die öffentliche Cloud wird es bald unterstützen) und die Schnittstelle deleteAndIncVersion hinzugefügt. Diese Schnittstelle löscht die Daten nicht wirklich, sondern markiert die Daten, um anzuzeigen, dass sie abgelaufen sind, und erhöht die Datenversionsnummer, wenn die Daten nicht vorhanden sind, wird NULL geschrieben und auch eine zufällige Datenversionsnummer generiert. OCS-Schreiben unterstützt den atomaren Vergleich von Versionsnummern: Unter der Annahme, dass die eingehende Versionsnummer mit der von OCS gespeicherten Datenversionsnummer übereinstimmt oder die Originaldaten nicht vorhanden sind, ist das Schreiben zulässig, andernfalls wird die Änderung abgelehnt.
Zurück zur aktuellen Szene: Thread A liest Key:Hello von OCS, ruft das Ergebnis „Not Found“ ab, beginnt mit der Anforderung von Daten von DB und ruft die Daten Key:Hello Value:World ab. Die Versionsnummerninformationen sind standardmäßig 1. Bevor A in OCS schreibt, initiiert ein anderer B-Thread eine Aktion zum Ändern der Daten. Key:Hello Value:OCS führt zunächst die Lösch-Cache-Aktion erfolgreich aus und generiert eine zufällige Version Zahl von 12345 (Konvention größer als 1000). Kehren Sie zu Thread A zurück und schreiben Sie weiter an OCS und fordern Sie das Schreiben von Key:Hello Value:World an. Zu diesem Zeitpunkt stellt das Cache-System fest, dass die eingehenden Versionsnummerninformationen nicht übereinstimmen (1! = 12345), der Schreibvorgang schlägt fehl Aufgabe von Thread A endet. ;Thread B hat auch den DB-Dateninhalt erfolgreich in Key:Hello Value:OCS geändert.
Zu diesem Zeitpunkt sind die Daten in OCS Key:Hello Value:NULL Version:12345; die Daten in DB sind Key:Hello Value:OCS. Bei nachfolgenden Leseaufgaben wird erneut versucht, die Daten in DB in OCS zu schreiben .
(2) Die Schreibsynchronisierung von zwischengespeicherten Daten und das Konsistenzproblem mit DB
Mit zunehmender Größe der Website und verbesserter Zuverlässigkeit wird es mit der Bereitstellung mehrerer IDCs konfrontiert sein. Zu diesem Zeitpunkt ist die Cache-Konsistenz zu einem wichtigen Thema geworden.
Um eine hohe Effizienz zu gewährleisten, verhindert das Cache-System zunächst einmal Festplatten-E/A, auch wenn BINLOG geschrieben wird. Aus Leistungsgründen kann das Cache-System natürlich nur synchron löschen, also nicht synchron schreiben Die Synchronisierung hat im Allgemeinen Vorrang vor dem Eintreffen der DB-Synchronisation (schließlich ist die Effizienz des Cache-Systems viel höher). Dann gibt es ein Szenario, in dem sich keine Daten im Cache und alte Daten in der DB befinden. Zu diesem Zeitpunkt liegt eine Geschäftsanforderung für Daten vor und der Lesecache wird nicht gefunden. Die aus der Datenbank gelesenen und in den Cache geladenen alten Daten sind immer noch alte Daten. Wenn die DB-Datensynchronisierung eintrifft, wird nur die Datenbank aktualisiert. und die zwischengespeicherten schmutzigen Daten können nicht gelöscht werden.
Wie aus der obigen Situation ersichtlich ist, liegt die Hauptursache der Inkonsistenz darin, dass heterogene Systeme nicht zusammenarbeiten können. Es kann nicht garantiert werden, dass DB-Daten zuerst synchronisiert werden und zwischengespeicherte Daten später synchronisiert werden. Wir müssen also überlegen, wie das Cache-System auf die DB-Synchronisierung wartet, oder können die beiden einen Synchronisierungsmechanismus gemeinsam nutzen? Die Cache-Synchronisierung basiert auch auf DB BINLOG, was eine praktikable Lösung darstellt.
Die Datenbank in IDC1 wird über BINLOG mit der Datenbank in IDC2 synchronisiert. In diesem Fall generiert die IDC2-DB-Datenänderung auch ein eigenes BINLOG. Die zwischengespeicherte Datensynchronisierung kann über IDC2-DB BINLOG durchgeführt werden. Nachdem das Cache-Synchronisationsmodul das BINLOG analysiert hat, wird der entsprechende Cache-Schlüssel ungültig gemacht und die Synchronisation von parallel auf seriell geändert, um die Reihenfolge sicherzustellen.
(3) Cache-Penetration (DB erlitt unnötigen Abfrageverkehr)
Methode 1: Es ist ein Bloom-Filter. Es handelt sich um einen äußerst platzsparenden probabilistischen Algorithmus und eine Datenstruktur, mit der bestimmt wird, ob sich ein Element in einer Menge befindet (ähnlich wie Hashset). Sein Kern ist ein langer binärer Vektor und eine Reihe von Hash-Funktionen. Implementieren Sie den Bloom-Filter mit der Guave von Google. 1) Es kommt zu einer Fehlberechnungsrate. 2) Unter normalen Umständen können Elemente nicht aus dem Bloom-Filter gelöscht werden. 3) Der Prozess der Bestimmung der Array-Länge Hash-Funktionen sind komplex und die Verteilung. Was sind die Verwendungsszenarien des Long-Filters? 1) Spam-Adressfilterung (die Anzahl der Adressen ist riesig) 2) Crawler-URL-Adressdeduplizierung 3) Lösung des Cache-Aufschlüsselungsproblems
Methode 2: Leere Ergebnisse speichern und die Zeit für leere Ergebnisse festlegen
(4) Cache-Lawine ( Das Festlegen des Caches auf die gleiche Ablaufzeit führt zu einer DB-Flut)
Methode 1: Die meisten Systemdesigner erwägen die Verwendung von Sperren oder Warteschlangen, um Single-Thread-(Prozess-)Schreibvorgänge in den Cache sicherzustellen und so zu vermeiden, dass viele gleichzeitige Anforderungen fallen während eines Ausfalls Auf dem zugrunde liegenden Speichersystem
Methode 2: Zufällige Ablaufzeit
(5) Cache-Zusammenbruch (Hotkey, kleine Lawine, verursacht durch eine große Anzahl gleichzeitiger Leseanforderungen)
Wenn der Cache zu einem bestimmten Zeitpunkt abläuft Zu diesem Zeitpunkt gibt es eine große Anzahl gleichzeitiger Anforderungen für diesen Schlüssel. Wenn diese Anforderungen feststellen, dass der Cache abgelaufen ist, laden sie normalerweise Daten aus der Backend-Datenbank und setzen sie in den Cache zurück. Zu diesem Zeitpunkt können große gleichzeitige Anforderungen die Backend-Datenbank sofort überlasten
Methode 1: 1. Verwenden Sie den vom Verteilungscache unterstützten Mutex-Schlüssel (Mutex-Schlüssel), um einen Mutex-Schlüssel festzulegen. Wenn der Vorgang erfolgreich zurückgegeben wird, führen Sie die Ladedatenbank durch Der Vorgang wird ausgeführt und der Cache zurückgesetzt, d. h. es erfolgt nur eine Lade-DB-Thread-Verarbeitung.
Methode 2: Verwenden Sie den Mutex-Schlüssel im Voraus: Legen Sie einen Timeout-Wert (Timeout1) innerhalb des Werts fest. Timeout1 ist kleiner als das tatsächliche Memcache-Timeout (Timeout2). Wenn Timeout1 aus dem Cache gelesen wird, wird festgestellt, dass es abgelaufen ist Wenn es soweit ist, verlängern Sie sofort Timeout1 und setzen Sie es in den Cache zurück. Laden Sie dann die Daten aus der Datenbank und legen Sie sie in den Cache. Dies erhöht das Eindringen des Geschäftscodes und erhöht die Codierungskomplexität. : Aus der Sicht von Redis gibt es tatsächlich keine Ablaufzeit, was sicherstellt, dass es kein Problem mit dem Ablauf des Hotspot-Schlüssels gibt, das heißt, dass er nicht „physisch“ abläuft. Aus funktionaler Sicht, wenn er nicht abläuft Wird es nicht statisch? Wir speichern die Ablaufzeit im Wert, der dem Schlüssel entspricht. Wenn festgestellt wird, dass er bald abläuft, wird der Cache über einen asynchronen Hintergrundthread erstellt, der ein „logischer“ Ablauf ist
(6) Häufige Cache-Füllung und Datenverlust im Cache-System. Das Problem
muss auf der Grundlage eines bestimmten Geschäfts analysiert werden. Normalerweise verwenden wir die LRU-Strategie zur Bewältigung von Überläufen und die RDB- und AOF-Persistenzstrategien von Redis, um die Datensicherheit zu gewährleisten unter bestimmten Umständen
Weitere Kenntnisse zum Thema Programmierung finden Sie unter:Programmiervideo
Das obige ist der detaillierte Inhalt vonLassen Sie uns gemeinsam die Redis-Cache-Konsistenz, Cache-Penetration, Cache-Aufschlüsselung und Cache-Avalanche-Probleme analysieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Der Redis -Cluster -Modus bietet Redis -Instanzen durch Sharding, die Skalierbarkeit und Verfügbarkeit verbessert. Die Bauschritte sind wie folgt: Erstellen Sie ungerade Redis -Instanzen mit verschiedenen Ports; Erstellen Sie 3 Sentinel -Instanzen, Monitor -Redis -Instanzen und Failover; Konfigurieren von Sentinel -Konfigurationsdateien, Informationen zur Überwachung von Redis -Instanzinformationen und Failover -Einstellungen hinzufügen. Konfigurieren von Redis -Instanzkonfigurationsdateien, aktivieren Sie den Cluster -Modus und geben Sie den Cluster -Informationsdateipfad an. Erstellen Sie die Datei nodes.conf, die Informationen zu jeder Redis -Instanz enthält. Starten Sie den Cluster, führen Sie den Befehl erstellen aus, um einen Cluster zu erstellen und die Anzahl der Replikate anzugeben. Melden Sie sich im Cluster an, um den Befehl cluster info auszuführen, um den Clusterstatus zu überprüfen. machen

Redis verwendet Hash -Tabellen, um Daten zu speichern und unterstützt Datenstrukturen wie Zeichenfolgen, Listen, Hash -Tabellen, Sammlungen und geordnete Sammlungen. Ernähren sich weiterhin über Daten über Snapshots (RDB) und appendiert Mechanismen nur Schreibmechanismen. Redis verwendet die Master-Slave-Replikation, um die Datenverfügbarkeit zu verbessern. Redis verwendet eine Ereignisschleife mit einer Thread, um Verbindungen und Befehle zu verarbeiten, um die Datenatomizität und Konsistenz zu gewährleisten. Redis legt die Ablaufzeit für den Schlüssel fest und verwendet den faulen Löschmechanismus, um den Ablaufschlüssel zu löschen.

Schritte zur Lösung des Problems, das Redis-Server nicht finden kann: Überprüfen Sie die Installation, um sicherzustellen, dass Redis korrekt installiert ist. Setzen Sie die Umgebungsvariablen Redis_host und Redis_port; Starten Sie den Redis-Server Redis-Server; Überprüfen Sie, ob der Server Redis-Cli Ping ausführt.

Redis Cluster ist ein verteiltes Bereitstellungsmodell, das die horizontale Expansion von Redis-Instanzen ermöglicht und durch Kommunikation zwischen Noten, Hash-Slot-Abteilung Schlüsselraum, Knotenwahlen, Master-Slave-Replikation und Befehlsumleitung implementiert wird: Inter-Node-Kommunikation: Virtuelle Netzwerkkommunikation wird durch Cluster-Bus realisiert. Hash -Slot: Teilen Sie den Schlüsselraum in Hash -Slots, um den für den Schlüssel verantwortlichen Knoten zu bestimmen. Knotenwahlen: Es sind mindestens drei Master -Knoten erforderlich, und nur ein aktiver Masterknoten wird durch den Wahlmechanismus sichergestellt. Master-Slave-Replikation: Der Masterknoten ist für das Schreiben von Anforderungen verantwortlich und der Slaveknoten ist für das Lesen von Anforderungen und Datenreplikation verantwortlich. Befehlsumleitung: Der Client stellt eine Verbindung zum für den Schlüssel verantwortlichen Knoten her, und der Knoten leitet falsche Anforderungen weiter. Fehlerbehebung: Fehlererkennung, Off-Linie markieren und neu

Redis verwendet fünf Strategien, um die Einzigartigkeit von Schlüssel zu gewährleisten: 1. Namespace -Trennung; 2. Hash -Datenstruktur; 3.. Datenstruktur festlegen; 4. Sonderzeichen von Stringschlüssel; 5. Lua -Skriptüberprüfung. Die Auswahl spezifischer Strategien hängt von Datenorganisationen, Leistung und Skalierbarkeit ab.

Um alle Schlüssel in Redis anzuzeigen, gibt es drei Möglichkeiten: Verwenden Sie den Befehl keys, um alle Schlüssel zurückzugeben, die dem angegebenen Muster übereinstimmen. Verwenden Sie den Befehl scan, um über die Schlüssel zu iterieren und eine Reihe von Schlüssel zurückzugeben. Verwenden Sie den Befehl Info, um die Gesamtzahl der Schlüssel zu erhalten.

Redis bestellte Sets (ZSETs) werden verwendet, um bestellte Elemente und Sortieren nach zugehörigen Bewertungen zu speichern. Die Schritte zur Verwendung von ZSET umfassen: 1. Erstellen Sie ein Zset; 2. Fügen Sie ein Mitglied hinzu; 3.. Holen Sie sich eine Mitgliederbewertung; 4. Holen Sie sich eine Rangliste; 5. Holen Sie sich ein Mitglied in der Rangliste; 6. Ein Mitglied löschen; 7. Holen Sie sich die Anzahl der Elemente; 8. Holen Sie sich die Anzahl der Mitglieder im Score -Bereich.

Um die Redis -Versionsnummer anzuzeigen, können Sie die folgenden drei Methoden verwenden: (1) Geben Sie den Info -Befehl ein, (2) Starten Sie den Server mit der Option --version und (3) die Konfigurationsdatei anzeigen.
