Heim  >  Artikel  >  Datenbank  >  Warum ist Redis Single-Threaded und warum ist es so schnell?

Warum ist Redis Single-Threaded und warum ist es so schnell?

青灯夜游
青灯夜游nach vorne
2021-05-12 10:57:445908Durchsuche

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:

Warum ist Redis Single-Threaded und warum ist es so schnell?

(2) Arbeitsmodus der In-Memory-Datenbank:

Warum ist Redis Single-Threaded und warum ist es so schnell?

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!

Warum ist Redis Single-Threaded und warum ist es so schnell?

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:

Warum ist Redis Single-Threaded und warum ist es so schnell?

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.

Warum ist Redis Single-Threaded und warum ist es so schnell?

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen