Inhaltsverzeichnis
Nicht blockierende E/A
Geplante Aufgaben
Heim Datenbank Redis In diesem Artikel erfahren Sie schnell, wie Sie das Thread-IO-Modell in Redis verstehen

In diesem Artikel erfahren Sie schnell, wie Sie das Thread-IO-Modell in Redis verstehen

Dec 21, 2021 am 10:19 AM
redis

Redis ist Single-Threaded, aber warum ist es so schnell? Ein Grund dafür ist, dass Redis nicht blockierende E/A und Multiplexing verwendet, um eine große Anzahl von Clientverbindungen zu verarbeiten. Der folgende Artikel wird Ihnen helfen, das Thread-IO-Modell in Redis zu verstehen. Ich hoffe, er wird Ihnen hilfreich sein!

In diesem Artikel erfahren Sie schnell, wie Sie das Thread-IO-Modell in Redis verstehen

Redis ist eine Single-Threaded-Anwendung und Nginx sind beide Single-Threaded-Server. [Verwandte Empfehlungen: Redis-Video-Tutorial]

Der Grund, warum Redis Single-Threaded und so schnell ist:

Erstens, weil sich alle seine Daten im Speicher befinden und alle Vorgänge bei der Verwendung von Redis Vorgänge auf Speicherebene sind Achten Sie auf Anweisungen mit einer Zeitkomplexität von O(n). Wenn die Datenmenge zu groß ist, werden andere Anweisungen blockiert und gewartet.

Der zweite Grund ist, dass Redis nicht verwendet wird. Das Blockieren von E/A und Multiplexing verarbeitet eine große Anzahl von Clientverbindungen.

Nicht blockierende E/A

Wenn wir die Lese- und Schreibmethode des Sockets verwenden, blockiert sie standardmäßig.

Das heißt, die Lesemethode wird aufgerufen, um einen Parameter n zu übergeben, was bedeutet, dass sie nach dem Lesen zurückkehrt Bis zu n Bytes. Wenn kein Byte vorhanden ist, wartet der Thread weiterhin, bis Daten eingehen oder die Verbindung geschlossen wird, und der Thread kann die folgende Logik ausführen Blockiert im Allgemeinen nicht, es sei denn, der Kernel ist ein Socket. Wenn der zugewiesene Schreibpuffer voll ist, blockiert die Schreibmethode, bis im Puffer freier Speicherplatz vorhanden ist.

Das Bild unten zeigt den detaillierten Vorgang des Lesens und Schreibens von Sockets.

In diesem Artikel erfahren Sie schnell, wie Sie das Thread-IO-Modell in Redis verstehenNon-blocking IO bietet bei der Verwendung von Sockets die Option Non_Blocking. Wenn diese Option aktiviert ist, blockieren die Lese- und Schreibmethoden nicht, können aber so viel lesen, wie sie können,

Wie viel Sie lesen können, hängt von der Anzahl der vom Kernel für den Socket zugewiesenen Datenbytes ab. Wie viel Sie schreiben können, hängt von der Anzahl der vom Kernel im Schreibpuffer des Sockets zugewiesenen Datenbytes ab

Die Lese- und Schreibmethoden geben Ihnen über den Rückgabewert Auskunft über die Anzahl der vom Programm gelesenen und geschriebenen Bytes.

Nicht blockierendes E/A bedeutet, dass der Thread beim Lesen und Schreiben nicht mehr blockiert werden muss. Das Lesen und Schreiben kann sofort abgeschlossen werden und der Thread kann weiterhin andere Aufgaben ausführen.

Multiplexing (Ereignisabfrage)

Obwohl nicht blockierendes IO schnell ist, bringt es auch ein Problem mit sich. Der Thread liest die Daten und kehrt nach dem Lesen eines Teils davon zurück. Wann wird er mit dem Lesen fortfahren? verbleibende Daten? Beim Schreiben von Daten ist der Puffer voll und wurde nicht vollständig geschrieben. Wann werden die restlichen Daten weitergeschrieben?

Wenn Sie weiterhin lesen oder schreiben können, sollten Sie der Anwendung eine Benachrichtigung geben, um der Anwendung mitzuteilen, dass Sie weiterhin lesen oder schreiben können. Zur Behebung dieses Problems wird die Ereignisabfrage-API verwendet.

select

Das Betriebssystem stellt dem Benutzerprogramm eine Auswahlfunktion zur Verfügung. Die Eingabe ist die Lese- und Schreibdeskriptorliste read_fds und write_fds, und die Ausgabe sind die entsprechenden Lese- und Schreibereignisse timeout Parameter, die maximale Zeit, die der Thread auf eine Zeitüberschreitung wartet, wenn ein Ereignis auftritt, und der Thread wird mit der Verarbeitung fortfahren. Wenn die Zeitüberschreitungszeit überschritten wird, kehrt die Methode ebenfalls zurück Wenn das Ereignis abgerufen wird, kann der Thread die entsprechenden Ereignisse einzeln verarbeiten. Nachdem das Ereignis verarbeitet wurde, ruft er weiterhin die Auswahl-API-Abfrage auf, sodass der Thread tatsächlich eine Endlosschleife ist. Er wählt und verarbeitet weiter und geht zurück und weiter. Diese Endlosschleife wird als Ereignisschleife bezeichnet, und eine Schleife ist ein Zyklus.

Ereignisschleifen-Pseudocode:

while True
    read_events, write_events = select(read_fds, write_fds, timeout)
    for event in read_events:
        handle_read(event.fd)
    for event in write_events:
        handle_write(event.fd)
    handle_others() # 做其他的逻辑处理,处理定时任务等等
Nach dem Login kopieren

Über die Select-Funktion können wir die Lese- und Schreibereignisse mehrerer Kanaldeskriptoren verarbeiten, sodass Systemfunktionsaufrufe wie Select als Multiplexing-APIs bezeichnet werden.

Moderne Multiplexing-APIs Das Betriebssystem verwendet nicht mehr den Select-Systemaufruf, sondern Epoll (Linux) und KQueue (FreeBSD, MacOSX). Die Leistung von Select wird sehr schlecht, wenn die Anzahl der Deskriptoren zunimmt. Es gibt geringfügige Unterschiede , aber sie können alle mit dem obigen Pseudocode verstanden werden. Wenn ein Ereignis im Deskriptor auftritt, wird das Deskriptorereignis in einer Schleife verarbeitet. Der Lesevorgang des Serversocket-Objekts bezieht sich auf den Aufruf von Accept, um die neue Verbindung vom Client zu akzeptieren Wenn eine Verbindung zustande kommt, wird dies auch durch das von select aufgerufene Leseereignis benachrichtigt. In diesem Artikel erfahren Sie schnell, wie Sie das Thread-IO-Modell in Redis verstehen

Die NIO-Technologie in Java ist die Ereignisabfrage, und auch andere Sprachen verfügen über diese Technologie.

Befehlswarteschlange

Redis ordnet jedem Client-Socket eine Befehlswarteschlange zu, und die vom Client gesendeten Befehle werden in der Reihenfolge „First In, First Out“ durch die Warteschlange verarbeitet.

Antwortwarteschlange

In ähnlicher Weise werden die von Redis zurückgegebenen Ergebnisse auch über eine jedem Client zugeordnete Warteschlange zurückgegeben. Wenn die Warteschlange leer ist, müssen vorerst keine Schreibereignisse abgerufen werden Der Client-Deskriptor wird von „Entfernen Sie ihn aus write_fds“ geändert und stellen Sie den Deskriptor dann in die Warteschlange, wenn Daten vorhanden sind. Dadurch kann vermieden werden, dass festgestellt wird, dass keine Daten zum Schreiben vorhanden sind, wenn der Select-Systemaufruf das Schreibereignis zurückgibt, was zu einer leeren Abfrage führt. nutzlose Abfragen und Verbrauch der Maschinen-CPU.

Geplante Aufgaben

Der Server muss nicht nur auf E/A-Ereignisse reagieren, sondern auch einige andere Dinge verarbeiten, z. B. die eigenen geplanten Aufgaben der Anwendung. Wenn der Thread beim Select-Aufruf blockiert und auf die Rückgabe von Select wartet, ist dies der Fall führt dazu, dass einige geplante Aufgaben ablaufen, aber nicht ausgeführt werden. In diesem Heap werden die am schnellsten auszuführenden Aufgaben an oberster Stelle aufgeführt aktualisiert die Aufgaben, die das Ende des Heaps erreicht haben. Nach Abschluss der Verarbeitung wird die Zeit aufgezeichnet, die für die Ausführung der Aufgabe im Heap erforderlich ist Zeit ist der Wert des Timeouts. Nach der Ausführung sind keine weiteren Aufgaben erforderlich. Redis kann höchstens so lange blockieren und nach Ablauf der Zeit die entsprechende Verarbeitung durchführen.

Die Ereignisverarbeitungsprinzipien von NodeJs und Nginx ähneln denen von Redis.

Weitere Kenntnisse zum Thema Programmierung finden Sie unter:

Programmiervideos

! !

Das obige ist der detaillierte Inhalt vonIn diesem Artikel erfahren Sie schnell, wie Sie das Thread-IO-Modell in Redis verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So erstellen Sie den Redis -Clustermodus So erstellen Sie den Redis -Clustermodus Apr 10, 2025 pm 10:15 PM

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 verwenden Sie den Befehl Redis So verwenden Sie den Befehl Redis Apr 10, 2025 pm 08:45 PM

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).

So lesen Sie den Quellcode von Redis So lesen Sie den Quellcode von Redis Apr 10, 2025 pm 08:27 PM

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.

So verwenden Sie ein einzelnes Gewinde -Redis So verwenden Sie ein einzelnes Gewinde -Redis Apr 10, 2025 pm 07:12 PM

Redis verwendet eine einzelne Gewindearchitektur, um hohe Leistung, Einfachheit und Konsistenz zu bieten. Es wird E/A-Multiplexing, Ereignisschleifen, nicht blockierende E/A und gemeinsame Speicher verwendet, um die Parallelität zu verbessern, jedoch mit Einschränkungen von Gleichzeitbeschränkungen, einem einzelnen Ausfallpunkt und ungeeigneter Schreib-intensiver Workloads.

So löschen Sie Redis -Daten So löschen Sie Redis -Daten Apr 10, 2025 pm 10:06 PM

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.

So lesen Sie Redis -Warteschlange So lesen Sie Redis -Warteschlange Apr 10, 2025 pm 10:12 PM

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.

So sehen Sie alle Schlüssel in Redis So sehen Sie alle Schlüssel in Redis Apr 10, 2025 pm 07:15 PM

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.

So implementieren Sie die zugrunde liegenden Redis So implementieren Sie die zugrunde liegenden Redis Apr 10, 2025 pm 07:21 PM

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.

See all articles