Warum ist Redis Single-Threaded und warum ist es so schnell?
Fast alle Java-bezogenen Interviews fragen nach der „28/20-Regel“ und den komplizierteren nach dem Cache Lawine. , Cache-Penetration, Cache-Vorwärmung, Cache-Aktualisierung, Cache-Downgrade und andere Probleme. Zu den am häufigsten verwendeten Cache-Servern gehören Redis, Memcached usw Es gibt nur Redis.
Wenn Sie noch nie einen Interviewer gefragt haben: „Warum soll Redis Single-Threaded sein und warum ist Redis so schnell?“ 》Wenn Sie diesen Artikel lesen, sollten Sie das Gefühl haben, dass dies eine sehr glückliche Sache ist! Wenn Sie ein guter Interviewer sind, können Sie diese Frage auch verwenden, um den Freund Ihres Gegenübers zu interviewen, der „durch das Wasser sieht“, um seine Meisterschaft zu testen.
Okay! Kommen Sie auf den Punkt! Lassen Sie uns zunächst diskutieren, was Redis ist, warum Redis so schnell ist, und dann diskutieren wir, warum Redis Single-Threaded ist. [Verwandte Empfehlungen: Redis-Video-Tutorial]
1. Einführung in Redis
Redis ist ein Open-Source-In-Memory-Datenstrukturspeichersystem, das als Datenbank, Cache und Nachrichten-Middleware verwendet werden kann.
Es unterstützt mehrere Arten von Datenstrukturen, wie z. B. String, Hash, List, Set, Sorted Set oder ZSet, sowie Bereichsabfragen, Bitmaps, Hyperloglogs und geografische Indexradiusabfragen. Darunter sind die fünf gängigen Datenstrukturtypen: String, List, Set, Hash und ZSet.
Redis verfügt über integrierte Replikation, LUA-Skripting, LRU-Eviction, Transaktionen und verschiedene Ebenen der Festplattenpersistenz. Durch Redis Sentinel und automatische Partitionierung (Cluster) wird eine hohe Verfügbarkeit (High Availability) gewährleistet.
Redis bietet auch Persistenzoptionen, die es Benutzern ermöglichen, ihre Daten zur Speicherung auf der Festplatte zu speichern. Abhängig von der tatsächlichen Situation kann der Datensatz in bestimmten Abständen auf die Festplatte exportiert (Snapshot) oder an das Befehlsprotokoll angehängt werden (AOF hängt nur Dateien an, wenn der Schreibbefehl ausgeführt wird, und kopiert den ausgeführten Schreibbefehl auf die Festplatte). Festplatte. Sie können die Persistenz auch deaktivieren und Redis als effiziente Netzwerk-Cache-Datenfunktion verwenden.
Redis verwendet keine Tabellen und seine Datenbank definiert oder zwingt Benutzer nicht dazu, verschiedene in Redis gespeicherte Daten zu verknüpfen.
Der Arbeitsmodus der Datenbank kann je nach Speichermethode in Festplattendatenbank und Speicherdatenbank unterteilt werden. Redis speichert Daten im Speicher. Beim Lesen und Schreiben von Daten ist es nicht durch die E/A-Geschwindigkeit der Festplatte begrenzt und daher extrem schnell.
(1) Arbeitsmodus der Festplattendatenbank:
(2) Arbeitsmodus der In-Memory-Datenbank:
Nachdem Sie die obige Beschreibung gelesen haben, wissen Sie etwas über einige häufige Redis-bezogene Interviews? Fragen? Zum Beispiel: Was ist Redis, welche gängigen Datenstrukturtypen gibt es bei Redis, wie bleibt Redis bestehen usw.
2. Wie schnell ist Redis?
Redis verwendet eine speicherbasierte KV-Datenbank, die ein Einzelprozess-Single-Thread-Modell verwendet. Sie ist in der Sprache C geschrieben. Die offiziell bereitgestellten Daten können 100.000+ QPS (Anzahl der Abfragen pro Sekunde) erreichen.
Diese Daten sind nicht schlechter als Memcached, dieselbe speicherbasierte KV-Datenbank, die Einzelprozess und Multithreading verwendet!
Die horizontale Achse ist die Anzahl der Verbindungen und die vertikale Achse ist QPS. Zu diesem Zeitpunkt spiegelt dieses Bild eine Größenordnung wider. Ich hoffe, dass jeder es während des Interviews richtig beschreiben kann. Fragen Sie nicht nach einer ganz anderen Größenordnung.
3. Warum ist Redis so schnell?
1. Die meisten Anfragen basieren vollständig auf dem Speicher und sind reine Speicheroperationen, die sehr schnell sind. Die Daten werden im Speicher gespeichert, ähnlich wie bei HashMap. Der Vorteil von HashMap besteht darin, dass die Datenstruktur einfach ist und die Datenoperation einfach ist Die Struktur in Redis ist speziell entwickelt
3. Durch die Verwendung eines einzelnen Threads werden unnötige Kontextwechsel und Konkurrenzbedingungen vermieden. Es gibt keine Notwendigkeit, verschiedene Sperrprobleme zu berücksichtigen Es gibt keinen Sperrvorgang, kein Leistungsverbrauch durch möglichen Deadlock.
4 Verwenden Sie ein Mehrkanal-I/O-Multiplex-Modell Die Unterschiede zwischen den Anwendungsprotokollen für die Kommunikation zwischen Clients sind unterschiedlich. Redis baut direkt einen eigenen VM-Mechanismus auf, denn wenn das allgemeine System Systemfunktionen aufruft, verschwendet es eine gewisse Zeit zum Verschieben und Anfordern
Die oben genannten Punkte sind relativ einfach zu verstehen. Im Folgenden werden wir kurz auf das Mehrkanal-E/A-Multiplexmodell eingehen:
(1) Mehrkanal-E/A-Multiplexmodell
Das Mehrkanal-E/A-Multiplexmodell ist Um Select, Poll und Epoll zu verwenden, können Sie E/A-Ereignisse mehrerer Streams gleichzeitig überwachen. Im Leerlauf blockieren sie den aktuellen Thread, wenn ein oder mehrere Streams E/A-Ereignisse haben Wenn Sie den blockierten Zustand aktivieren, fragt das Programm alle Streams ab (epoll fragt nur die Streams ab, die tatsächlich Ereignisse ausgegeben haben) und verarbeitet nur die bereiten Streams nacheinander. Dieser Ansatz vermeidet viele nutzlose Vorgänge.
Hier bezieht sich „mehrere“ auf mehrere Netzwerkverbindungen und „Wiederverwendung“ auf die Wiederverwendung desselben Threads.
Die Verwendung der Mehrkanal-E/A-Multiplexing-Technologie ermöglicht es einem einzelnen Thread, mehrere Verbindungsanforderungen effizient zu verarbeiten (wodurch der Zeitverbrauch von Netzwerk-E/A minimiert wird), und Redis verarbeitet Daten im Speicher sehr schnell, was bedeutet, dass In-Memory The Der Betrieb wird nicht zu einem Engpass, der die Leistung von Redis beeinträchtigt. Die oben genannten Punkte tragen hauptsächlich zum hohen Durchsatz von Redis bei.
4. Warum ist Redis Single-Threaded?
Wir müssen zunächst verstehen, dass alle oben genannten Analysen dazu dienen, eine Atmosphäre zu schaffen, in der Redis schnell ist! In den offiziellen FAQ heißt es, dass die CPU nicht der Flaschenhals von Redis ist, da es sich bei Redis um einen speicherbasierten Vorgang handelt. Der Flaschenhals von Redis ist höchstwahrscheinlich die Größe des Maschinenspeichers oder der Netzwerkbandbreite. Da Single-Threading einfach zu implementieren ist und die CPU nicht zum Engpass wird, ist es logisch, eine Single-Thread-Lösung zu verwenden (die Verwendung von Multi-Threading verursacht schließlich große Probleme!).
Sie werden vielleicht weinen, wenn Sie das sehen! Ich dachte, es gäbe einige wichtige technische Punkte, die Redis mit einem einzigen Thread so schnell machen würden, aber ich hatte keine offizielle Antwort erwartet, die uns zu täuschen schien! Wir können jedoch bereits jetzt klar erklären, warum Redis so schnell ist, und gerade weil es im Single-Thread-Modus bereits schnell ist, ist es nicht erforderlich, Multi-Threading zu verwenden!
Allerdings kann unser Single-Threaded-Ansatz die Multi-Core-CPU-Leistung nicht nutzen, aber wir können sie verbessern, indem wir mehrere Redis-Instanzen auf einer einzigen Maschine öffnen!
Warnung 1: Der einzelne Thread, den wir hier hervorgehoben haben, ist nur ein Thread, wenn er unsere Netzwerkanfragen verarbeitet. Jeder braucht hier einmal klare Aufmerksamkeit. Wenn Redis beispielsweise beibehalten wird, wird es als Unterprozess oder Unterthread ausgeführt (der spezifische Unterthread oder Unterprozess muss vom Leser eingehend untersucht werden). Ich habe beispielsweise den Redis-Prozess überprüft auf dem Testserver und habe dann den Thread unter dem Prozess gefunden:
Der Parameter „-T“ des ps-Befehls zeigt Threads anzeigen an, möglicherweise mit SPID-Spalte. Die Spalte „SID“ gibt die Thread-ID an In der Spalte „CMD“ wird der Threadname angezeigt.
Warnung 2: Im letzten Absatz der FAQ im Bild oben heißt es, dass Multithreading ab Redis-Version 4.0 unterstützt wird. Multithreading-Vorgänge werden jedoch nur bei bestimmten Vorgängen durchgeführt! Ob dieser Artikel in zukünftigen Versionen weiterhin Single-Threaded sein wird, muss daher von den Lesern überprüft werden!
5. Hinweise
1. Wir wissen, dass Redis das „Single-Threaded-Multiplexed-IO-Modell“ verwendet, um leistungsstarke Speicherdatendienste zu implementieren, aber gleichzeitig dies Der Mechanismus verringert die Parallelität von Redis bei der Ausführung zeitaufwändiger Befehle wie Sunion.
Da es sich um einen einzelnen Thread handelt, wird nur ein Vorgang gleichzeitig ausgeführt. Daher führen zeitaufwändige Befehle zu einer Verringerung der Parallelität, nicht nur der Lese-Parallelität, sondern auch der Schreib-Parallelität. Ein einzelner Thread kann nur einen CPU-Kern verwenden, sodass mehrere Instanzen auf demselben Multi-Core-Server gestartet werden können, um einen Master-Master oder Master-Slave zu bilden. Zeitaufwändige Lesebefehle können vollständig auf dem Slave ausgeführt werden.
Redis.conf-Elemente, die geändert werden müssen:
pidfile /var/run/redis/redis_6377.pid #pidfile sollte die Portnummer hinzufügen
Port 6377 #Dies muss geändert werden
logfile /var/log/redis / redis_6377.log #Der Name der Protokolldatei wird auch mit der Portnummer hinzugefügt
dbfilename dump_6377.rdb #rdbfile wird auch mit der Portnummer hinzugefügt
2 „Wir können den Lastausgleich des Betriebssystems nicht zulassen, da wir unseren kennen.“ Eigene Programme besser, sodass wir ihnen manuell CPU-Kerne zuweisen können, ohne zu viel CPU zu verbrauchen oder unseren kritischen Prozess mit einer Reihe anderer Prozesse zu überlasten. „
CPU ist ein wichtiger Faktor, weil es Single-Threaded ist. Modell, Redis bevorzugt große Caches und schnelle CPUs anstelle mehrerer Kerne.
Auf Multi-Core-CPU-Servern hängt die Redis-Leistung auch von der NUMA-Konfiguration und der Prozessorbindungsposition ab. Die offensichtlichste Auswirkung ist, dass Redis-Benchmark CPU-Kerne zufällig verwendet. Für genaue Ergebnisse müssen Sie feste Prozessortools verwenden (unter Linux können Sie tasket verwenden). Der effektivste Weg besteht darin, Client und Server in zwei verschiedene CPUs aufzuteilen, um den Cache der dritten Ebene zu verwenden.
6. Verlängerung
Im Folgenden finden Sie auch einige Modelle, die Sie kennen sollten. Ich wünsche Ihnen ein erfolgreiches Vorstellungsgespräch!
1. Einzelprozess-Multithread-Modell: MySQL, Memcached, Oracle (Windows-Version);
2. Multiprozessmodell: Oracle (Linux-Version);
3. Nginx wird als Master-Prozess bezeichnet (entspricht dem Verwaltungsprozess) und der andere wird als Worker-Prozess bezeichnet Arbeitsprozess). Es gibt zwei Startmethoden:
(1) Einzelprozessstart: Derzeit gibt es nur einen Prozess im System, der sowohl die Rolle des Master-Prozesses als auch des Worker-Prozesses spielt.
(2) Multiprozess-Start: Zu diesem Zeitpunkt verfügt das System über einen und nur einen Master-Prozess und mindestens ein Worker-Prozess arbeitet.
(3) Der Master-Prozess führt hauptsächlich einige globale Initialisierungsarbeiten durch und die Verwaltung von Worker-Ereignissen erfolgt im Worker.
Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Einführung in die Programmierung! !
Das obige ist der detaillierte Inhalt vonWarum ist Redis Single-Threaded und warum ist es so schnell?. 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

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

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

So löschen Sie Redis -Daten: Verwenden Sie den Befehl Flushall, um alle Schlüsselwerte zu löschen. Verwenden Sie den Befehl flushdb, um den Schlüsselwert der aktuell ausgewählten Datenbank zu löschen. Verwenden Sie SELECT, um Datenbanken zu wechseln, und löschen Sie dann FlushDB, um mehrere Datenbanken zu löschen. Verwenden Sie den Befehl del, um einen bestimmten Schlüssel zu löschen. Verwenden Sie das Redis-Cli-Tool, um die Daten zu löschen.

Um eine Warteschlange aus Redis zu lesen, müssen Sie den Warteschlangenname erhalten, die Elemente mit dem Befehl LPOP lesen und die leere Warteschlange verarbeiten. Die spezifischen Schritte sind wie folgt: Holen Sie sich den Warteschlangenname: Nennen Sie ihn mit dem Präfix von "Warteschlange:" wie "Warteschlangen: My-Queue". Verwenden Sie den Befehl LPOP: Wischen Sie das Element aus dem Kopf der Warteschlange aus und geben Sie seinen Wert zurück, z. B. die LPOP-Warteschlange: my-queue. Verarbeitung leerer Warteschlangen: Wenn die Warteschlange leer ist, gibt LPOP NIL zurück, und Sie können überprüfen, ob die Warteschlange existiert, bevor Sie das Element lesen.

Die Verwendung der REDIS -Anweisung erfordert die folgenden Schritte: Öffnen Sie den Redis -Client. Geben Sie den Befehl ein (Verbschlüsselwert). Bietet die erforderlichen Parameter (variiert von der Anweisung bis zur Anweisung). Drücken Sie die Eingabetaste, um den Befehl auszuführen. Redis gibt eine Antwort zurück, die das Ergebnis der Operation anzeigt (normalerweise in Ordnung oder -err).

Um die Operationen zu sperren, muss die Sperre durch den Befehl setNX erfasst werden und dann den Befehl Ablauf verwenden, um die Ablaufzeit festzulegen. Die spezifischen Schritte sind: (1) Verwenden Sie den Befehl setNX, um zu versuchen, ein Schlüsselwertpaar festzulegen; (2) Verwenden Sie den Befehl Ablauf, um die Ablaufzeit für die Sperre festzulegen. (3) Verwenden Sie den Befehl Del, um die Sperre zu löschen, wenn die Sperre nicht mehr benötigt wird.

Der beste Weg, um Redis -Quellcode zu verstehen, besteht darin, Schritt für Schritt zu gehen: Machen Sie sich mit den Grundlagen von Redis vertraut. Wählen Sie ein bestimmtes Modul oder eine bestimmte Funktion als Ausgangspunkt. Beginnen Sie mit dem Einstiegspunkt des Moduls oder der Funktion und sehen Sie sich die Codezeile nach Zeile an. Zeigen Sie den Code über die Funktionsaufrufkette an. Kennen Sie die von Redis verwendeten Datenstrukturen. Identifizieren Sie den von Redis verwendeten Algorithmus.

Verwenden Sie das Redis-Befehlszeilen-Tool (REDIS-CLI), um Redis in folgenden Schritten zu verwalten und zu betreiben: Stellen Sie die Adresse und den Port an, um die Adresse und den Port zu stellen. Senden Sie Befehle mit dem Befehlsnamen und den Parametern an den Server. Verwenden Sie den Befehl Hilfe, um Hilfeinformationen für einen bestimmten Befehl anzuzeigen. Verwenden Sie den Befehl zum Beenden, um das Befehlszeilenwerkzeug zu beenden.

Auf CentOS -Systemen können Sie die Ausführungszeit von LuA -Skripten einschränken, indem Sie Redis -Konfigurationsdateien ändern oder Befehle mit Redis verwenden, um zu verhindern, dass bösartige Skripte zu viele Ressourcen konsumieren. Methode 1: Ändern Sie die Redis -Konfigurationsdatei und suchen Sie die Redis -Konfigurationsdatei: Die Redis -Konfigurationsdatei befindet sich normalerweise in /etc/redis/redis.conf. Konfigurationsdatei bearbeiten: Öffnen Sie die Konfigurationsdatei mit einem Texteditor (z. B. VI oder Nano): Sudovi/etc/redis/redis.conf Setzen Sie die LUA -Skriptausführungszeit.
