Vorwort:
Ich glaube, dass Redis-Middleware für die meisten Programmierer sehr vertraut sein sollte. Programmierer, die bei der Arbeit häufig Geschäftscode schreiben, verwenden in der tatsächlichen Arbeit jedoch möglicherweise nur Set-Value-, Get-Value- und andere Vorgänge und verfügen nicht über ein umfassendes Verständnis von Redis. Lassen Sie mich Ihnen Redis nun im Detail vorstellen.
Was ist Redis?
Redis ist eine Open-Source-Schlüsselwertspeicherdatenbank, die in der Sprache C geschrieben ist. Es kann in Szenarien wie Caching, Ereignisveröffentlichung und -abonnement sowie Hochgeschwindigkeitswarteschlangen verwendet werden. Und es unterstützt umfangreiche Datentypen: String (String), Hash (Hash), Liste (Liste), Set (ungeordneter Satz), Zset (sortierter Satz: geordneter Satz)
Redis-Anwendungsszenarien in Projekten
1. Cache-Daten
wird am häufigsten verwendet. Daten, die häufig abgefragt werden müssen und sich nicht häufig ändern, werden oft als Hot Data bezeichnet.
2. Nachrichtenwarteschlange
entspricht einem Nachrichtenabonnementsystem wie ActiveMQ und RocketMQ. Wenn Sie höhere Anforderungen an die Datenkonsistenz haben, wird dennoch empfohlen, MQ zu verwenden Informationen
Große E-Commerce-Plattformen initialisieren den Cache der Seitendaten. Wenn Sie beispielsweise ein Ticket auf Qunar.com kaufen, unterscheidet sich der Preis auf der Startseite von dem Preis, auf den Sie klicken.
5. Hotspot-Daten
Zum Beispiel Echtzeit-Hotspots auf Nachrichten-Websites, Hot-Suchen auf Weibo usw., die regelmäßig aktualisiert werden müssen. Wenn die Gesamtdatenmenge relativ groß ist, wirkt sich die direkte Abfrage aus der Datenbank auf die Leistung aus Erweiterung des Geschäfts. Angesichts großer Datenmengen führt die direkte Verwendung von MySQL zu Leistungseinbußen, und das Lesen und Schreiben von Daten ist ebenfalls sehr langsam. So können wir Caching nutzen, um große Datenmengen zu verarbeiten.
Jetzt sind wir also so:
Das obige Bild beschreibt nur kurz die Rolle des Caches. Wenn die Datenmenge weiter zunimmt, müssen wir die Master-Slave-Replikationstechnologie verwenden, um eine Lese-Schreib-Trennung zu erreichen Die Datenbankschicht interagiert direkt mit dem Cache. Wenn sich Daten im Cache befinden, werden diese direkt an den Client zurückgegeben. Wenn nicht, werden sie von MySql abgefragt. Dies reduziert den Druck auf die Datenbank und verbessert die Effizienz. Wenn ein neues Mobiltelefon auf den Markt kommt, kommt es normalerweise zu Eilverkäufen. Im gleichen Zeitraum erhält der Server viele Bestellanfragen. Wir müssen die atomaren Operationen von Redis verwenden, um diesen „einzelnen Thread“ zu erreichen. Zuerst speichern wir den Bestand in einer Liste. Angenommen, es sind 10 Artikel im Bestand, dann fügen wir 10 Zahlen in die Liste ein. Diese Zahl hat keine praktische Bedeutung und stellt nur 10 Artikel im Bestand dar. Nachdem der Eilkauf begonnen hat, wird jedes Mal, wenn ein Benutzer ankommt, eine Zahl aus der Liste angezeigt, die angibt, dass der Eilkauf des Benutzers erfolgreich war. Wenn die Liste leer ist, bedeutet das, dass sie entfernt wurde. Da die Pop-Operation der Liste atomar ist, werden sie auch dann nacheinander ausgeführt, wenn viele Benutzer gleichzeitig eintreffen. Off-Topic: Einige Eilkäufe schränken Anfragen auf der Front-End-Seite direkt ein Front-End und nicht zum Back-End-Server gehenWarum ist Redis so schnell?
1. Redis ist ein reiner Speichervorgang, der bei Bedarf manuell auf der Festplatte gespeichert werden muss.
2 Redis ist ein Single-Thread-Vorgang und vermeidet so die häufigen Kontextwechselvorgänge.
3. Die Datenstruktur von Redis ist einfach und die Datenverarbeitung ist relativ einfach. 4. Die zugrunde liegenden Implementierungsmethoden und die Anwendungsprotokolle für die Kommunikation mit dem Client sind unterschiedlich VM-Mechanismus, denn wenn das allgemeine System Systemfunktionen aufruft, verschwendet es eine gewisse Zeit zum Verschieben und Anfordern
5. Verwenden Sie ein Mehrkanal-E/A-Multiplexmodell, nicht blockierende E/AMehrkanal-I /O-Multiplexing: Die E/A-Multiplexing-Technologie scheint das Problem zu lösen, dass Prozesse oder Threads bestimmte E/A-Systemaufrufe blockieren. Sobald ein bestimmter Deskriptor bereit ist (normalerweise lesebereit oder schreibbereit). Bevor dieser Dateideskriptor Lese- und Schreibvorgänge ausführt, kann er das Programm benachrichtigen, entsprechende Lese- und Schreibvorgänge auszuführen Redis unterstützt fünf Arten von Rich-Datentypen. Wie sollten wir also in verschiedenen Szenarien auswählen? StringString ist der am häufigsten verwendete Datentyp. Er kann jede Art von Zeichenfolge speichern, einschließlich binärer, JSONisierter Objekte und sogar Base64-codierter Bilder. Die maximale Kapazität einer Zeichenfolge in Redis beträgt 512 MB, was als allmächtig bezeichnet werden kann. HashWird häufig zum Speichern strukturierter Daten verwendet. In Forensystemen können beispielsweise Benutzer-IDs, Spitznamen, Avatare, Punkte und andere Informationen gespeichert werden. Wenn Sie die Informationen ändern müssen, müssen Sie nur den Wert über den Schlüssel herausnehmen, ihn deserialisieren, den Wert eines Elements ändern und ihn dann in Redis serialisieren und speichern. Die Hash-Struktur wird gespeichert Wird geändert, wenn ein einzelnes Hash-Element kleiner als eine bestimmte Anzahl ist. Komprimierter Speicher, sodass Sie viel Speicher sparen können. Dies ist in der String-Struktur nicht vorhanden.
List
List ist als bidirektionale verknüpfte Liste implementiert, die die umgekehrte Suche und das Durchlaufen unterstützt, was die Bedienung erleichtert. Viele Implementierungen in Redis, einschließlich Sendepufferwarteschlangen, verursachen jedoch einen gewissen zusätzlichen Speicheraufwand. usw. Diese Datenstruktur wird verwendet. Darüber hinaus können Sie mit dem Befehl lrange eine Redis-basierte Paging-Funktion implementieren, die eine hervorragende Leistung und eine gute Benutzererfahrung bietet.
Set
Die von Set bereitgestellten externen Funktionen ähneln den Listenfunktionen. Das Besondere ist, dass Set automatisch Daten deduplizieren muss und nicht möchte, dass doppelte Daten angezeigt werden Set verwenden.
Sortiersatz
kann nach der Gewichtung einer bestimmten Bedingung sortiert werden. Sie können beispielsweise eine Ranking-Datenanwendung basierend auf der Anzahl der Klicks erstellen.
Datenkonsistenz des Redis-Cache
Im wahrsten Sinne des Wortes ist es unmöglich, dass Datenbankdaten und zwischengespeicherte Daten konsistent sind. Daten werden in zwei Kategorien unterteilt: endgültige Konsistenz und starke Konsistenz. Wenn die Anforderungen an die Daten im Unternehmen hoch sein müssen, kann Caching nicht verwendet werden. Der Cache kann lediglich die letztendliche Konsistenz der Daten sicherstellen.
Alles, was wir tun können, ist, die Datenkonsistenz so weit wie möglich sicherzustellen. Unabhängig davon, ob zuerst die Datenbank und dann der Cache gelöscht wird oder ob zuerst der Cache und dann die Datenbank gelöscht wird, kann es zu Dateninkonsistenzen kommen. Da Lese- und Schreibvorgänge gleichzeitig erfolgen, können wir deren Reihenfolge nicht garantieren. Die spezifische Reaktionsstrategie muss noch auf der Grundlage der Geschäftsanforderungen festgelegt werden, daher werde ich hier nicht auf Details eingehen.
Redis-Ablauf und Speicherbeseitigung
Wenn Redis Daten speichert, können wir die Ablaufzeit festlegen. Doch wie wird dieser Schlüssel gelöscht?
Zuerst dachte ich, es handele sich um eine geplante Löschung, aber später stellte ich fest, dass dies nicht der Fall war, da bei einer geplanten Löschung ein Timer erforderlich wäre, um den Schlüssel kontinuierlich zu überwachen. es verbraucht viele CPU-Ressourcen.
Beim Redis-Ablauflöschen wird standardmäßig alle 100 ms ein abgelaufener Schlüssel erkannt. Bei der Erkennung handelt es sich nicht um eine sequentielle Erkennung, sondern um eine zufällige Erkennung. Wird ein Fisch durch das Netz schlüpfen? Offensichtlich hat Redis dies auch berücksichtigt, wenn wir einen abgelaufenen Schlüssel lesen/schreiben, wird die Lazy-Deletion-Strategie von Redis ausgelöst und der abgelaufene Schlüssel wird direkt gelöscht, was bedeutet, dass ein Teil der vom Benutzer gespeicherten Schlüssel verwendet werden kann Redis. Automatisch löschen, sodass die Daten nicht im Cache gefunden werden können. Der Speicher unseres Servers beträgt 2G, aber mit der Geschäftsentwicklung haben die zwischengespeicherten Daten 2G überschritten. Dies hat jedoch keinen Einfluss auf die Ausführung unseres Programms, da der sichtbare Speicher des Betriebssystems nicht durch den physischen Speicher begrenzt ist. Es spielt keine Rolle, ob der physische Speicher nicht ausreicht. Der Computer weist einen Speicherplatz auf der Festplatte als virtuellen Speicher zu. Dies ist die ursprüngliche Absicht von Redis, zwei Anwendungsszenarien zu entwerfen: Cache und persistenter Speicher , müssen wir in der Datenbank abgefragt werden. Wenn Hacker häufig auf Daten zugreifen, die sich nicht im Cache befinden, verliert der Cache sofort seine Bedeutung, und der Druck aller Anforderungen wird auf die Datenbank fallen, was zu Anomalien bei der Datenbankverbindung führt.
Lösung:
1. Richten Sie geplante Aufgaben im Hintergrund ein, um zwischengespeicherte Daten aktiv zu aktualisieren. Diese Lösung ist leicht zu verstehen, aber wenn die Schlüssel verstreut sind, ist der Vorgang immer noch relativ kompliziert. 2. Hierarchisches Caching. Wenn Sie beispielsweise zwei Ebenen des Cache-Schutzes einrichten, hat der Cache der Ebene 1 eine kurze Ablaufzeit und der Cache der Ebene 2 eine lange Ablaufzeit. Wenn eine Anfrage eingeht, wird sie zunächst im Cache der Ebene 1 durchsucht. Wenn die entsprechenden Daten nicht im Cache der Ebene 1 gefunden werden, wird der Thread gesperrt. Dieser Thread ruft die Daten dann aus der Datenbank ab und aktualisiert sie auf Ebene 1 und Level-2-Caches. Andere Threads erhalten es direkt vom Level-2-Thread. 3. Stellen Sie einen Abfangmechanismus bereit und pflegen Sie intern eine Reihe legaler Schlüsselwerte. Wenn der angeforderte Schlüssel ungültig ist, wird er direkt zurückgegeben.
Cache-Lawine
Cache-Lawine bedeutet, dass der Cache aus bestimmten Gründen (z. B. Ausfallzeit, Cache-Dienst hängt oder nicht reagiert) abstürzt, was dazu führt, dass eine große Anzahl von Anforderungen die Back-End-Datenbank erreicht, was zum Absturz der Datenbank führt und die Zum Zusammenbruch des gesamten Systems kommt es zum oben erwähnten Cache-Ausfall.
So vermeiden Sie Lawinen:
1. Fügen Sie dem Cache eine zufällige effektive Zeit innerhalb eines bestimmten Bereichs hinzu und legen Sie unterschiedliche Ablaufzeiten für verschiedene Schlüssel fest, um gleichzeitige kollektive Ausfälle zu vermeiden.
2. Erstellen Sie ähnlich wie bei der Cache-Ausfalllösung einen sekundären Cache und lesen Sie Daten aus dem Kopie-Cache, wenn der ursprüngliche Cache ausfällt.
Fazit:
Redis verfügt über eine extrem hohe Leistung mit einer Lesegeschwindigkeit von 110.000 Mal/s und einer Schreibgeschwindigkeit von 81.000 Mal/s. Es unterstützt Transaktionen, Backups und umfangreiche Datentypen.
Alles hat zwei Seiten, und Redis hat auch Mängel:
1 Da es sich um eine In-Memory-Datenbank handelt, ist die auf einem einzelnen Computer gespeicherte Datenmenge begrenzt, und Entwickler müssen im Voraus abschätzen und unnötige Daten löschen Zeit.
2. Nach dem Ändern der Redis-Daten müssen die auf der Festplatte gespeicherten Daten erneut zum Inhalt hinzugefügt werden. Dies dauert zu diesem Zeitpunkt. Redis kann nicht normal ausgeführt werden.
Originallink: https://www.pianshen.com/article/589052263/
Verwandte Empfehlungen: Redis-Datenbank-Tutorial
Das obige ist der detaillierte Inhalt vonWarum heißt es, dass Redis sehr nützlich ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!