Heim >Datenbank >Redis >Lassen Sie uns über Redis-Dateiereignisse und Zeitereignisse sprechen

Lassen Sie uns über Redis-Dateiereignisse und Zeitereignisse sprechen

WBOY
WBOYnach vorne
2022-03-08 17:20:171972Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Redis, in dem hauptsächlich die Probleme im Zusammenhang mit Dateiereignissen und Zeitereignissen vorgestellt werden. Dateiereignisse sind die Abstraktion von Socket-Vorgängen durch den Server, und Zeitereignisse sind das Timing solcher Vorgänge durch den Server. Ich hoffe, dass die Abstraktion von Operationen für alle hilfreich sein wird.

Lassen Sie uns über Redis-Dateiereignisse und Zeitereignisse sprechen

Empfohlenes Lernen: Redis-Tutorial

Redis war vor 6.0 Single-Threading. Nach 6.0 können Sie Multithreading über die Konfigurationsdatei aktivieren io ausführen.

Der Redis-Server ist ein ereignisgesteuertes Programm. Der Server muss die folgenden zwei Arten von Ereignissen verarbeiten:

  • Dateiereignis (Dateiereignis)
    Der Redis-Server stellt über einen Socket eine Verbindung zum Client (oder einem anderen Redis-Server) her. und das Dateiereignis ist eine Abstraktion von Serveroperationen auf Sockets. Die Kommunikation zwischen dem Server und dem Client (oder einem anderen Server) generiert entsprechende Dateiereignisse, und der Server führt eine Reihe von Netzwerkkommunikationsvorgängen durch, indem er diese Ereignisse abhört und verarbeitet. Der Datei-Event-Handler verwendet das Programm „I/O-Multiplexing“ (Multiplexing), um mehrere Sockets gleichzeitig abzuhören und den Sockets basierend auf den aktuell von den Sockets ausgeführten Aufgaben unterschiedliche Event-Handler zuzuordnen. Wenn der überwachte Socket bereit ist, Vorgänge wie Verbindungsantworten (Akzeptieren), Lesen (Lesen), Schreiben (Schreiben), Schließen (Schließen) usw. auszuführen, wird das dem Vorgang entsprechende Dateiereignis generiert. Die Datei Der Ereignishandler ruft den zuvor dem Socket zugeordneten Ereignishandler auf, um diese Ereignisse zu verarbeiten. Zeitereignis
  • Einige Vorgänge auf dem Redis-Server (z. B. die serverCron-Funktion) müssen zu einem bestimmten Zeitpunkt ausgeführt werden, und Zeitereignisse sind die Abstraktion solcher Zeitvorgänge durch den Server. Zeitereignisse werden in zwei Kategorien unterteilt: Die erste Art sind zeitgesteuerte Ereignisse (die die einmalige Ausführung eines Programms nach einer bestimmten Zeit ermöglichen) und die andere Art sind periodische Ereignisse (die die einmalige Ausführung eines Programms zu jeder bestimmten Zeit ermöglichen).

  • 1. Dateiereignisse

1. Der Dateiereignisprozessor besteht aus vier Teilen: Socket, E/A-Multiplexer, Dateiereignis-Dispatcher und Ereignisprozessor.

Der E/A-Multiplexer ist dafür verantwortlich, mehrere Sockets abzuhören und die Sockets, die Ereignisse generiert haben, an den Dateiereignis-Dispatcher zu übertragen. Obwohl mehrere Dateiereignisse gleichzeitig auftreten können, stellt ein einzelner E/A-Multiplexer immer die Sockets aller generierten Ereignisse in eine Warteschlange und verwendet diese Warteschlange dann zum Ordnen und Synchronisieren. Der Zustellungs-Socket wird Socket für Socket an das Dateiereignis gesendet . Wenn das vom vorherigen Socket generierte Ereignis verarbeitet wird (die mit dem Socket verbundene Ereignisverarbeitung ist abgeschlossen), sendet der E/A-Multiplexer weiterhin den nächsten Socket an den Dateiereignis-Dispatcher. Der Dateiereignis-Dispatcher empfängt den Socket vom I /O-Multiplexer und verwendet den entsprechenden Event-Handler entsprechend der Art des vom Socket generierten Ereignisses. Der Server führt verschiedene Socket-Zuordnungen für verschiedene Zeichen aus. Diese Handler definieren die Aktionen, die der Server ausführen soll, wenn ein Ereignis auftritt.


2. E/A-MultiplexingLassen Sie uns über Redis-Dateiereignisse und Zeitereignisse sprechen
Alle Funktionen des Redis-Multiplexing-Programms werden durch Paketieren von E/A-Multiplexing-Funktionsbibliotheken wie select, epoll, evport und kqueue implementiert

3, Dateiereignistyp

AE_READABLE Ereignis

Wenn der Socket lesbar wird (der Client führt einen Schreib- oder Schließvorgang aus) oder wenn ein neuer Socket erscheint, der antworten kann, generiert der Socket ein AE_READABLE-Ereignis.

  • AE_WAITABLE-Ereignis

    Wenn der Socket beschreibbar wird (der Client führt einen Lesevorgang aus), wird das AE_WAITABLE-Ereignis generiert.
  • Der I/O-Multiplexer hört sowohl das AE_READABLE-Ereignis als auch das AE_WAITABLE-Ereignis ab Treten zwei Ereignisse gleichzeitig auf, priorisiert der Ereignis-Dispatcher das Ereignis AE_READABLE, was bedeutet, dass der Server zuerst den Socket liest und dann den Socket schreibt.

4. Dateiereignisprozessor

  • Verbindungsantwortprozessor: Dieser Prozessor wird verwendet, um auf die Verbindung des Clients mit dem Listening-Socket des Servers zu reagieren mit dem AE_READABLE-Ereignis des Server-Listening-Sockets. Wenn der Client eine Verbindung zum Server-Listening-Socket herstellt, generiert der Socket ein AE_READABLE-Ereignis, das die Ausführung des Verbindungsantwortprozessors auslöst und die entsprechende Socket-Antwortoperation ausführt.
  • Befehlsanforderungsprozessor
  • Wenn ein Client über den Verbindungsantwortprozessor erfolgreich eine Verbindung zum Server herstellt, ordnet der Server das AE_READABLE-Ereignis des Sockets dem Befehlsanforderungsprozessor zu, wenn der Client zu diesem Zeitpunkt eine Befehlsanforderung an den Server sendet. Der Socket generiert ein AE_READABLE-Ereignis, das die Ausführung des Befehlsanforderungsprozessors auslöst und Vorgänge wie das Lesen des Sockets durchführt. Während des gesamten Prozesses der Verbindung des Clients mit dem Server ordnet der Server immer den Befehlsanforderungshandler dem AE_READABEL-Ereignis des Client-Sockets zu.
  • Befehlsantwortprozessor
  • Wenn der Server eine Befehlsantwort hat, die an den Client gesendet werden muss, ordnet der Server das AE_WRITABLE-Ereignis des Client-Sockets dem Befehlsantwortprozessor zu, wenn der Client bereit ist, die zurückgegebene Befehlsantwort zu empfangen vom Server Wenn das Ereignis AE_WAITABEL generiert wird, führt es dazu, dass der Befehlsantwortprozessor den entsprechenden Socket-Schreibvorgang ausführt. Wenn die Befehlsantwort gesendet wird, trennt der Server den Befehlsantworthandler vom AE_WAITABLE-Ereignis des Client-Sockets. 5. Ein Beispiel für ein abgeschlossenes Client-Server-Verbindungsereignis antwortet auf die Verbindung des Clients. Reagieren Sie auf die Anfrage, erstellen Sie dann einen Client-Socket und einen Client-Status und verknüpfen Sie das AE_REAADABEL-Ereignis des Client-Sockets mit dem Befehlsanforderungsprozessor, damit der Client eine Befehlsanforderung an den Hauptserver senden kann.
  • Unter der Annahme, dass der Client später eine Befehlsanforderung an den Hauptserver sendet, generiert der Client-Socket ein AE_READABEL-Ereignis, das die Ausführung des Befehlsanforderungsprozessors auslöst. Der Prozessor liest den Befehl des Clients und übergibt ihn dann zur Ausführung an das zugehörige Programm .

Durch die Ausführung des Befehls wird eine entsprechende Befehlsantwort generiert. Um diese Befehlsantwort an den Client zurückzusenden, ordnet der Server das AE_WAITABLE-Ereignis dem Befehlsantwortprozessor zu. Wenn der Client versucht, die Befehlsantwort zu lesen, generiert der Client ein AE_WAITABLE-Ereignis, das die Ausführung des Befehlsantwortprozessors auslöst. Wenn der Befehlsantwortprozessor die Befehlsantwort in den Socket im gesamten Server schreibt, gibt der Server den Client frei socket Das AE_WAITABLE-Ereignis ist mit der Ausführung des Befehlsantwort-Handlers verknüpft.

2. Zeitereignisse

1. Die Zusammensetzung von Zeitereignissen

id

Der Server erstellt eine weltweit eindeutige ID für Zeitereignisse. Die ID-Nummern steigen von klein nach groß.

when

Ein UNIX-Zeitstempel mit Millisekundengenauigkeit, der die Ankunftszeit eines Zeitereignisses aufzeichnet.
  • timeProc
    Zeitereignisprozessor, eine Funktion. Wenn ein Zeitereignis eintrifft, ruft der Server den entsprechenden Prozessor auf, um das Ereignis zu verarbeiten.

  • Ob ein Zeitereignis ein zeitgesteuertes Ereignis oder ein periodisches Ereignis ist, hängt vom Rückgabewert des Zeitereignisprozessors ab. Wenn der Ereignisprozessor ae.h/AE_NOMORE zurückgibt, ist dieses Ereignis ein zeitgesteuertes Ereignis, und das wird auch der Fall sein Nach einmaligem Eintreffen verarbeitet. Löschen und nie wieder eintreffen. Wenn der Ereignishandler einen anderen ganzzahligen Wert als AE_NOMORE zurückgibt, handelt es sich bei dem Ereignis um ein periodisches Ereignis. Wenn ein Zeitereignis erreicht wird, aktualisiert der Server das Attribut „when“ des Ereignisses basierend auf dem Rückgabewert des Ereignishandlers, sodass das Das Ereignis wird für einen bestimmten Zeitraum fortgesetzt. Es kommt nach einer bestimmten Zeit erneut an und wird auf diese Weise aktualisiert und ausgeführt.
  • Implementierung
  • Der Server fügt alle Zeitereignisse in eine ungeordnete verknüpfte Liste ein (
Ungeordnet bezieht sich nicht auf das ID-Feld, sondern auf das Wann-Feld, daher muss jedes Mal die gesamte verknüpfte Liste durchlaufen werden.

), jedes Mal, wenn die Wenn der Event Executor ausgeführt wird, durchläuft er die gesamte verknüpfte Liste, findet alle eingegangenen Ereignisse und ruft den entsprechenden Event-Handler auf.

Hier muss erklärt werden, dass der Redis-Server im Normalmodus nur serverCron als Zeitereignis verwendet, obwohl es sich um eine ungeordnete verknüpfte Liste handelt, da die Länge der verknüpften Liste nicht sehr lang ist Rolle von Zeigern, und im Benchmark-Modus verwendet der Server nur zwei Zeitereignisse, sodass die Auswirkungen der vollständigen Durchquerung auf die Leistung vernachlässigbar sind.

serverCron-Funktion

Ein kontinuierlich laufender Redis-Server muss seine eigenen Ressourcen und seinen Status regelmäßig überprüfen und anpassen, um sicherzustellen, dass der Server langfristig und stabil laufen kann. Diese regelmäßigen Vorgänge werden von der redis.c/serverCron-Funktion ausgeführt Hauptfunktion Zu den Jobs gehören:

  • Aktualisieren Sie verschiedene statistische Informationen des Servers, wie Zeit, Speichernutzung, Datenbanknutzung usw.
  • Bereinigen Sie abgelaufene Schlüssel-Wert-Paare in der Datenbank.
  • Schließen und bereinigen Sie Clients mit fehlgeschlagenen Verbindungen.
  • Versuchen Sie, einen AOF- oder RDB-Persistenzvorgang durchzuführen.
  • Wenn der Server der Master-Server ist, führen Sie eine regelmäßige Synchronisierung auf dem Slave-Server durch.
  • Wenn er sich im Cluster-Modus befindet, führen Sie eine regelmäßige Synchronisierung und Verbindungstests auf dem Cluster durch.

Ereignisplanung und -ausführung

Da es auf dem Server zwei Ereignistypen gibt, Dateiereignisse und Zeitereignisse, muss der Server diese beiden Ereignisse planen und entscheiden, wann das Dateiereignis verarbeitet werden soll und wann die Zeit verarbeitet werden soll. Ereignisse und wie viel Zeit damit verbracht wird, sich damit zu befassen usw.
Der Pseudocode des Verarbeitungsprozesses lautet wie folgt:

def aeProcessEvents():
	# 获取到达时间离当前最近的时间事件
	tem_event = aeSearchNearestTimer()
	
	# 计算上一步获得到的事件 距离到达还有多少秒
	remaind_ms = time_event.when - unix_ts_now()
	
	# 如果事件已经到达, 那么remaind_ms的值可能为负数,设置为0
	remaind_ms = max(remaind_ms, 0)
	
	# 阻塞并等待文件事件产生,最大阻塞时间由timeval结构决定,
	# 如果remaind_ms的值为0,那么aeAPiPoll调用之后马上返回,不阻塞
	aeApiPoll(timeval)
	# 处理所有已经产生的文件事件
	processFileEvents()
	# 处理所有已经到达的时间事件
	proccessTimeEvents()

Ereignisplanungs- und Ausführungsregeln:
1) Die maximale Blockierungszeit der aeApiPoll-Funktion wird durch das Zeitereignis bestimmt, dessen Ankunftszeit der aktuellen Zeit am nächsten kommt kann verhindern, dass der Server häufig Zeitereignisse verarbeitet. Durch Abfragen (beschäftigtes Warten) kann auch sichergestellt werden, dass die aeApiPoll-Funktion nicht zu lange blockiert.

2) Da Dateiereignisse zufällig auftreten, wartet der Server und verarbeitet das Dateiereignis erneut, wenn nach dem Warten und Verarbeiten eines Dateiereignisses kein Zeitereignis eintrifft. Während das Dateiereignis weiter ausgeführt wird, nähert sich die Zeit allmählich der durch das Zeitereignis festgelegten Ankunftszeit und erreicht schließlich die Ankunftszeit. Zu diesem Zeitpunkt kann der Server mit der Verarbeitung des Ankunftszeitereignisses beginnen.

3) Die Verarbeitung von Dateiereignissen und Zeitereignissen wird synchron, geordnet und atomar ausgeführt. Der Server unterbricht die Ereignisverarbeitung nicht und verhindert daher keine Ereignisse, unabhängig vom Prozessor der Dateiereignisse oder Zeitereignisprozessoren Sie minimieren die Blockierungszeit des Programms und geben bei Bedarf aktiv Ausführungsrechte auf, wodurch die Möglichkeit eines Ereignismangels verringert wird. Wenn der Befehlsantwortprozessor beispielsweise eine Befehlsantwort an den Client-Socket schreibt und die Anzahl der geschriebenen Bytes eine voreingestellte Konstante überschreitet, verwendet der Befehlsantwortprozessor aktiv Break, um die Schreibschleife zu verlassen Beim nächsten Mal werden durch Zeitereignisse auch sehr zeitaufwändige Persistenzvorgänge zur Ausführung in Unterthreads oder Unterprozesse verschoben.

4) Da das Zeitereignis nach dem Dateiereignis ausgeführt wird und zwischen den Ereignissen kein Vorrang besteht, liegt die tatsächliche Verarbeitungszeit des Zeitereignisses normalerweise etwas später als die durch das Zeitereignis festgelegte Ankunftszeit.

Es besteht eine kooperative Beziehung zwischen Dateiereignissen und Zeitereignissen. Der Server verarbeitet diese beiden Ereignisse nacheinander, und während der Ereignisverarbeitung erfolgt keine Bevorzugung. Die tatsächliche Bearbeitungszeit von Zeitereignissen liegt in der Regel später als die eingestellte Ankunftszeit.

Empfohlenes Lernen: Redis-Lerntutorial

Das obige ist der detaillierte Inhalt vonLassen Sie uns über Redis-Dateiereignisse und Zeitereignisse sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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