この記事では、Redisに関する関連知識を提供します, 主にファイル イベントと時間イベントに関連する問題を紹介します. ファイル イベントはサーバーによるソケット操作の抽象化であり、時間イベントはその抽象化ですこのようなサーバー側のタイミング操作について、皆さんのお役に立てれば幸いです。
推奨学習:Redis チュートリアル
Redis は 6.0 より前はシングルスレッドでしたが、6.0 以降は、 6.0 以降のスレッド、マルチスレッドとは、I/O を高速化するために io での実行にマルチスレッドを使用することを指します。
ファイル イベント プロセッサは、ソケット、I/O マルチプレクサ、ファイル イベント ディスパッチャの 4 つの部分で構成されます。 、イベントハンドラ。
I/O マルチプレクサは、複数のソケットをリッスンし、イベントを生成したソケットをファイル イベント ディスパッチャに送信する役割を果たします。複数のファイル イベントが同時に発生する可能性がありますが、単一の I/O マルチプレクサは常に、生成されたすべてのイベント ソケットをキューに入れ、このキューを使用して順序付けと同期を行います。配信ソケットは、一度に 1 ソケットずつファイル イベントにディスパッチされます。前のソケットによって生成されたイベントが処理されると (ソケットに関連付けられたイベント処理が完了すると)、I/O マルチプレクサーは次のソケットをファイル イベント ディスパッチャーに送信し続けます。ファイル イベント ディスパッチャーは、I/O マルチプレクサーからソケットを受け取ります。 /O マルチプレクサーであり、ソケットによって生成されたイベントのタイプに応じて、対応するイベント ハンドラーを使用します。サーバーは、異なる文字に対して異なるソケットの関連付けを実行します。イベント ハンドラー、これらのハンドラーは、イベントの発生時にサーバーが実行するアクションを定義します。
Redis の多重化プログラムのすべての機能は、I/O 多重化 select、epoll、evport、kqueue によってパッケージ化されています。実装する関数ライブラリ
AE_READABLE イベント
ソケットが読み取り可能になったとき (クライアントが書き込みまたはクローズ操作を実行したとき)、または応答できる新しいソケットが現れたとき、ソケットはAE_READABLE イベントを生成します。
AE_WAITABLE イベント
ソケットが書き込み可能になると (クライアントが読み取り操作を実行すると)、AE_WAITABLE イベントが生成されます
I/O マルチプレクサは同時に、 AE_READABLE イベントと AE_WAITABLE イベント ソケットが両方のイベントを同時に生成する場合、イベント ディスパッチャーは AE_READABLE イベントを優先します。つまり、サーバーは最初にソケットを読み取り、次にソケットに書き込みます。
最初に Redis クライアントがサーバーへの接続を開始し、次にリッスンしているソケットが AE_READABEL イベントを生成し、接続応答処理 プロセッサが実行され、プロセッサがクライアントの接続要求に応答して、クライアント ソケットとクライアント ステータスを作成し、クライアント ソケットの AE_READABEL イベントをコマンド要求プロセッサに関連付けます。これにより、クライアントはマスター サーバーからコマンドリクエスト。
その後、クライアントがコマンド要求をメインサーバーに送信すると仮定すると、クライアントソケットは AE_READABEL イベントを生成し、コマンド要求プロセッサーの実行をトリガーします。プロセッサーはクライアントのコマンドを読み取り、それをサーバーに渡します。実行する関連プログラム。
コマンドを実行すると、対応するコマンド応答が生成されます。このコマンド応答行をクライアントに送信するために、サーバーは AE_WAITABLE イベントをコマンド応答プロセッサに関連付けます。クライアントがコマンド応答を読み取ろうとすると、クライアントは AE_WAITABLE イベントを生成し、コマンド応答プロセッサの実行をトリガーします。コマンド応答プロセッサがコマンド応答をサーバー全体のソケットに書き込むと、サーバーはクライアントを解放します。 AE_WAITABLE イベントは、コマンド応答ハンドラーの実行に関連付けられています。
タイム イベントが時限イベントであるか定期イベントであるかは、タイム イベント プロセッサの戻り値によって決まります。イベント プロセッサが ae.h/AE_NOMORE を返す場合、イベントは時限イベントです。 . 一度到達すると削除され、再度到達することはありません。イベント ハンドラーが AE_NOMORE 以外の整数値を返す場合、そのイベントは周期的なイベントです。時間イベントに達すると、サーバーはイベント ハンドラーの戻り値に基づいてイベントの when 属性を更新します。イベントは一定期間継続し、一定時間が経過すると再び到着し、このように更新されて実行されます。
サーバーはすべての時刻イベントを順序なしのリンク リストに入れます (順序なしは id フィールドを参照するのではなく、when フィールドを参照するため、毎回トラバースする必要があります)リンク リストを完了します。)、イベント エグゼキュータが実行されるたびに、リンク リスト全体を走査し、到着したすべてのイベントを検索し、対応するイベント ハンドラを呼び出します。
ここで説明する必要があるのは、順序なしリンク リストではあるものの、リンク リストの長さはそれほど長くないということです。通常モードでは、Redis サーバーは時間イベントとして serverCron のみを使用するため、この機会は次のように縮退します。ポインターの役割 ベンチマーク モードでは、サーバーは 2 つの時間イベントのみを使用するため、完全な走査がパフォーマンスに与える影響は無視できます。
継続的に稼働する Redis サーバーは、サーバーが長期的に安定して稼働できるように、定期的に自身のリソースとステータスを確認および調整する必要があります。これらの定期的な操作は Redis によって実行されます。 .c/serverCron 関数は実行を担当し、主なタスクは次のとおりです:
サーバーにはファイル イベントと時間イベントという 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 サイトの他の関連記事を参照してください。