Redis ファイルイベントと時間イベントについて話しましょう

WBOY
リリース: 2022-03-08 17:20:17
転載
1927 人が閲覧しました

この記事では、Redis に関する関連知識を提供します, 主にファイル イベントと時間イベントに関連する問題を紹介します. ファイル イベントはサーバーによるソケット操作の抽象化であり、時間イベントはその抽象化ですこのようなサーバー側のタイミング操作について、皆さんのお役に立てれば幸いです。

Redis ファイルイベントと時間イベントについて話しましょう

推奨学習: Redis チュートリアル

Redis は 6.0 より前はシングルスレッドでしたが、6.0 以降は、 6.0 以降のスレッド、マルチスレッドとは、I/O を高速化するために io での実行にマルチスレッドを使用することを指します。

Redis サーバーはイベント駆動型プログラムであり、サーバーは次の 2 種類のイベントを処理する必要があります:

  • ファイル イベント (ファイル イベント)
    Redis サーバーは通信します。ソケット (または他の Redis サーバー) を介してクライアントと接続し、ファイル イベントはサーバーによるソケット操作の抽象化です。サーバーとクライアント (または他のサーバー) 間の通信により、対応するファイル イベントが生成され、サーバーはこれらのイベントをリッスンして処理することで、一連のネットワーク通信操作を完了します。ファイル イベント ハンドラーは、I/O multiplexing (多重化) プログラムを使用して、複数のソケットを同時にリッスンし、ソケット デバイスによって現在実行されているタスクに基づいて、異なるイベント ハンドラーをソケットに関連付けます。監視対象のソケットが接続応答(accept)、読み取り(read)、書き込み(write)、クローズ(close)などの操作を実行できる状態になると、その操作に対応したファイルイベントが生成されます。ファイル イベント ハンドラーは、ソケットに以前に関連付けられていたイベント ハンドラーを呼び出して、これらのイベントを処理します。
  • タイム イベント (タイム イベント)
    Redis サーバーの一部の操作 (serverCron 関数など) は、特定の時点で実行する必要があります。タイム イベントは、そのようなタイミングをサーバーが抽象化したものです。オペレーション。時間イベントは 2 つのカテゴリに分類されます。1 つ目のタイプは時間イベント (指定した時間後にプログラムを 1 回実行できる)、もう 1 つのタイプは周期イベント (指定した時間ごとにプログラムを 1 回実行できる) です。

1. ファイル イベント

1. ファイル イベント プロセッサ

ファイル イベント プロセッサは、ソケット、I/O マルチプレクサ、ファイル イベント ディスパッチャの 4 つの部分で構成されます。 、イベントハンドラ。
Redis ファイルイベントと時間イベントについて話しましょう
I/O マルチプレクサは、複数のソケットをリッスンし、イベントを生成したソケットをファイル イベント ディスパッチャに送信する役割を果たします。複数のファイル イベントが同時に発生する可能性がありますが、単一の I/O マルチプレクサは常に、生成されたすべてのイベント ソケットをキューに入れ、このキューを使用して順序付けと同期を行います。配信ソケットは、一度に 1 ソケットずつファイル イベントにディスパッチされます。前のソケットによって生成されたイベントが処理されると (ソケットに関連付けられたイベント処理が完了すると)、I/O マルチプレクサーは次のソケットをファイル イベント ディスパッチャーに送信し続けます。ファイル イベント ディスパッチャーは、I/O マルチプレクサーからソケットを受け取ります。 /O マルチプレクサーであり、ソケットによって生成されたイベントのタイプに応じて、対応するイベント ハンドラーを使用します。サーバーは、異なる文字に対して異なるソケットの関連付けを実行します。イベント ハンドラー、これらのハンドラーは、イベントの発生時にサーバーが実行するアクションを定義します。

2. I/O 多重化

Redis の多重化プログラムのすべての機能は、I/O 多重化 select、epoll、evport、kqueue によってパッケージ化されています。実装する関数ライブラリ

3. ファイル イベント タイプ

  • AE_READABLE イベント
    ソケットが読み取り可能になったとき (クライアントが書き込みまたはクローズ操作を実行したとき)、または応答できる新しいソケットが現れたとき、ソケットはAE_READABLE イベントを生成します。

  • AE_WAITABLE イベント
    ソケットが書き込み可能になると (クライアントが読み取り操作を実行すると)、AE_WAITABLE イベントが生成されます
    I/O マルチプレクサは同時に、 AE_READABLE イベントと AE_WAITABLE イベント ソケットが両方のイベントを同時に生成する場合、イベント ディスパッチャーは AE_READABLE イベントを優先します。つまり、サーバーは最初にソケットを読み取り、次にソケットに書き込みます。

4. ファイル イベント プロセッサ

  • 接続応答プロセッサ
    接続応答プロセッサ、このプロセッサはクライアントをサーバーのリッスン ソケットに接続するために使用されます。クライアントは応答します。 Redis サーバーが初期化されると、プログラムはこの接続応答プロセッサをサーバー リスニング ソケットの AE_READABLE イベントに関連付けます。クライアントがサーバー リスニング ソケットに接続すると、ソケットが生成されます。AE_READABLE イベントが接続応答の実行をトリガーします。プロセッサにアクセスし、対応するソケット応答操作を実行します。
  • コマンド リクエスト プロセッサ
    クライアントが接続応答プロセッサを通じてサーバーに正常に接続すると、サーバーはソケットの AE_READABLE イベントをコマンド リクエスト プロセッサに関連付けます。コマンド要求の場合、ソケットは AE_READABLE イベントを生成し、コマンド要求プロセッサーが実行され、ソケット読み取りなどの操作が実行されます。クライアントがサーバーに接続する全プロセス中、サーバーは常にコマンド要求ハンドラーをクライアント ソケットの AE_READABEL イベントに関連付けます。
  • コマンド応答プロセッサ
    サーバーにクライアントに送信する必要があるコマンド応答がある場合、サーバーはクライアント ソケットの AE_WRITABLE イベントをコマンド応答プロセッサに関連付けます。サーバーがコマンド応答を返すと、AE_WAITABEL イベントが生成され、コマンド応答プロセッサーが実行され、対応するソケット書き込み操作が実行されます。コマンド応答が送信されると、サーバーはクライアント ソケットの AE_WAITABLE イベントからコマンド応答ハンドラーの関連付けを解除します。

5. 1 回限りのクライアント/サーバー接続イベントの例

最初に Redis クライアントがサーバーへの接続を開始し、次にリッスンしているソケットが AE_READABEL イベントを生成し、接続応答処理 プロセッサが実行され、プロセッサがクライアントの接続要求に応答して、クライアント ソケットとクライアント ステータスを作成し、クライアント ソケットの AE_READABEL イベントをコマンド要求プロセッサに関連付けます。これにより、クライアントはマスター サーバーからコマンドリクエスト。

その後、クライアントがコマンド要求をメインサーバーに送信すると仮定すると、クライアントソケットは AE_READABEL イベントを生成し、コマンド要求プロセッサーの実行をトリガーします。プロセッサーはクライアントのコマンドを読み取り、それをサーバーに渡します。実行する関連プログラム。

コマンドを実行すると、対応するコマンド応答が生成されます。このコマンド応答行をクライアントに送信するために、サーバーは AE_WAITABLE イベントをコマンド応答プロセッサに関連付けます。クライアントがコマンド応答を読み取ろうとすると、クライアントは AE_WAITABLE イベントを生成し、コマンド応答プロセッサの実行をトリガーします。コマンド応答プロセッサがコマンド応答をサーバー全体のソケットに書き込むと、サーバーはクライアントを解放します。 AE_WAITABLE イベントは、コマンド応答ハンドラーの実行に関連付けられています。

2. 時間イベント

1. 時間イベントの構成

  • id
    サーバーは、時間イベントに対してグローバルに一意の ID を作成します。 ID 番号は小さいものから大きいものへと順番に増加します。
  • when
    タイムイベントの到着時刻を記録するミリ秒精度の UNIX タイムスタンプ。
  • timeProc
    タイム イベント プロセッサ、関数。タイムイベントが到着すると、サーバーは対応するプロセッサを呼び出してイベントを処理します。

タイム イベントが時限イベントであるか定期イベントであるかは、タイム イベント プロセッサの戻り値によって決まります。イベント プロセッサが ae.h/AE_NOMORE を返す場合、イベントは時限イベントです。 . 一度到達すると削除され、再度到達することはありません。イベント ハンドラーが AE_NOMORE 以外の整数値を返す場合、そのイベントは周期的なイベントです。時間イベントに達すると、サーバーはイベント ハンドラーの戻り値に基づいてイベントの when 属性を更新します。イベントは一定期間継続し、一定時間が経過すると再び到着し、このように更新されて実行されます。

実装

サーバーはすべての時刻イベントを順序なしのリンク リストに入れます (順序なしは id フィールドを参照するのではなく、when フィールドを参照するため、毎回トラバースする必要があります)リンク リストを完了します。)、イベント エグゼキュータが実行されるたびに、リンク リスト全体を走査し、到着したすべてのイベントを検索し、対応するイベント ハンドラを呼び出します。
ここで説明する必要があるのは、順序なしリンク リストではあるものの、リンク リストの長さはそれほど長くないということです。通常モードでは、Redis サーバーは時間イベントとして serverCron のみを使用するため、この機会は次のように縮退します。ポインターの役割 ベンチマーク モードでは、サーバーは 2 つの時間イベントのみを使用するため、完全な走査がパフォーマンスに与える影響は無視できます。

serverCron 関数

継続的に稼働する Redis サーバーは、サーバーが長期的に安定して稼働できるように、定期的に自身のリソースとステータスを確認および調整する必要があります。これらの定期的な操作は Redis によって実行されます。 .c/serverCron 関数は実行を担当し、主なタスクは次のとおりです:

  • 時間、メモリ使用量、データベース使用量など、サーバーのさまざまな統計情報を更新します。
  • データベース内の期限切れのキーと値のペアをクリアします。
  • 接続に失敗したクライアントを閉じてクリーンアップします。
  • AOF または RDB 永続化操作を実行してみます。
  • サーバーがマスター サーバーの場合は、スレーブ サーバーで定期的な同期を実行します。
  • クラスタ モードの場合は、クラスタ上で定期的な同期と接続テストを実行します。

イベントのスケジュールと実行

サーバーにはファイル イベントと時間イベントという 2 つのイベント タイプがあるため、サーバーはこれら 2 つのイベントをスケジュールし、いつファイルを処理するかを決定する必要があります。イベント、イベントを処理する時刻、イベントの処理に費やす時間など。
処理プロセスの疑似コードは次のとおりです。

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()
ログイン後にコピー

イベントのスケジュールと実行ルール:
1) aeApiPoll 関数の最大ブロック時間は、到着時間が次の時間イベントによって決まります。これにより、サーバーが時間イベントを頻繁にポーリング (ビジー待機) することを回避でき、また、aeApiPoll 関数が長時間ブロックされないようにすることもできます。

2) ファイル イベントはランダムに出現するため、ファイル イベントを待機して処理してもタイム イベントが到着しない場合、サーバーは待機してファイル イベントを再度処理します。ファイルイベントが実行され続けると、時刻は時刻イベントで設定された到着時刻に徐々に近づき、最終的に到着時刻に達すると、サーバーは到着時刻イベントの処理を開始できます。

3) ファイル イベントとタイム イベントの処理は、同期的、順序正しく、アトミックに実行されます。サーバーはイベント処理を途中で中断したり、イベントをプリエンプトしたりすることはありません。したがって、ファイル イベントであっても、プロセッサまたはタイム イベント プロセッサは、プログラムのブロック時間を可能な限り短縮し、必要に応じて積極的に実行権を放棄することで、イベント枯渇の可能性を減らします。たとえば、コマンド応答プロセッサがクライアント ソケットにコマンド応答を書き込むときに、書き込まれたバイト数が事前に設定された定数を超えると、コマンド応答プロセッサは積極的にブレークを使用して書き込みループから抜け出します。さらに、時間イベントは、非常に時間のかかる永続化操作をサブスレッドまたはサブプロセスに入れて実行します。

4) 時間イベントはファイル イベントの後に実行され、イベント間にプリエンプションがないため、通常、時間イベントの実際の処理時間は、時間イベントによって設定された到着時間よりわずかに遅くなります。

ファイル イベントと時間イベントの間には協力関係があり、サーバーはこれら 2 つのイベントを順番に処理し、イベント処理中にプリエンプションは発生しません。タイムイベントの実際の処理時間は、通常、設定された到着時間よりも遅くなります。

推奨学習: Redis 学習チュートリアル

以上がRedis ファイルイベントと時間イベントについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート