Redis はリモート辞書サービスです。ANSI C 言語で書かれたオープンソースのログタイプの Key-Value データベースで、ネットワークをサポートし、メモリに基づいて永続化できます。 、多言語 API を提供します。
(学習ビデオ共有: redis ビデオ チュートリアル )
ファイル イベント プロセッサ
Redis は、Reactor モードに基づいたネットワーク イベント プロセッサを開発しました。このハンドラをファイルイベントハンドラと呼びます。その構造は、複数のソケット、IO マルチプレクサ、ファイル イベント ディスパッチャ、およびイベント プロセッサの 4 つの部分で構成されます。ファイル イベント ディスパッチャー キューの消費はシングル スレッドであるため、Redis はシングル スレッド モデルと呼ばれます。
メッセージ処理プロセス
ファイル イベント プロセッサは、I/O 多重化 (多重化) プロシージャを使用して、複数のソケットを同時にリッスンし、異なるイベントをリッスンします。ハンドラーは、現在実行中のタスクに基づいてソケットに関連付けられます。
監視対象のソケットが接続応答 (受け入れ)、読み取り (読み取り)、書き込み (書き込み)、閉じる (クローズ) などの操作を実行する準備ができている場合、その操作に対応するファイル イベントが発生します。ファイル イベント ハンドラーは、ソケットに以前に関連付けられていたイベント ハンドラーを呼び出して、これらのイベントを処理します。
複数のファイル イベントが同時に発生する可能性がありますが、I/O マルチプレクサは常にイベントを生成するすべてのソケットをキューにプッシュし、このキューを通過してソケットをファイル イベント ディスパッチャに順次、同期的に送信します。一度にソケット: 前のソケットによって生成されたイベントが処理されるとき (ソケットはイベントのオブジェクトです)、関連するイベント ハンドラーが実行されます)、I/O マルチプレクサは次のソケットをファイル イベントに送信し続けます。発車係。
I/O多重化プログラムの実装
RedisのI/O多重化プログラムの全機能はselecting、epoll、evport、kqueueでパッケージ化されており、関数ライブラリを多重化することで実装されています。多重化関数ライブラリは、ae_select.c、ae_epoll.c、ae_kqueue.c など、Redis ソース コード内の別個のファイルに対応します。
Redis は各 I/O 多重化関数ライブラリに同じ API を実装しているため、以下の図に示すように、基礎となる I/O 多重化プログラムの実装は交換可能です。
epoll の詳細な説明については、クリックして表示し、epoll の効率的な操作の原理を完全に理解することができます。
I/ における Redis の役割O 多重化プログラム #include マクロは、実装ソース コードで対応するルールを定義するために使用されます。プログラムは、コンパイル中にシステム内で最もパフォーマンスの高い I/O 多重化関数ライブラリを、Redis I/O 多重化の基礎となる実装として自動的に選択します。 :
/* Include the best multiplexing layer supported by this system. * The following should be ordered by performances, descending. */ #ifdef HAVE_EVPORT #include "ae_evport.c" #else #ifdef HAVE_EPOLL #include "ae_epoll.c" #else #ifdef HAVE_KQUEUE #include "ae_kqueue.c" #else #include "ae_select.c" #endif #endif #endif
ファイル イベントの種類
I/O マルチプレクサは、複数のソケットの ae.h/AE_READABLE イベントおよび ae.h/AE_WRITABLE イベントをリッスンできます。イベントとソケット操作は次のとおりです。
ソケットが読み取り可能になったとき (クライアントがソケットに対して書き込み操作を実行するか、クローズ操作を実行する)、または新しいソケットが表示されたとき (クライアントサーバーのリスニングソケットで接続操作を実行すると、ソケットは AE_READABLE イベントを生成します。
ソケットが書き込み可能になると (クライアントがソケットに対して読み取り操作を実行すると)、ソケットは AE_WRITABLE イベントを生成します。 I/O マルチプレクサにより、サーバーはソケットの AE_READABLE イベントと AE_WRITABLE イベントを同時にリッスンできるようになります。ソケットが両方のイベントを同時に生成した場合、ファイル イベント ディスパッチャーは AE_READABLE イベントを優先し、AE_READABLE イベントが完了するまで待機します。 AE_READABLE イベントを処理した後、AE_WRITABLE イベントを処理します。これは、ソケットが読み取りと書き込みの両方が可能な場合、サーバーは最初にソケットから読み取り、次にソケットに書き込みを行うことを意味します。
ファイル イベント プロセッサ
Redis は、ファイル イベント用に複数のプロセッサを作成しました。これらのイベント プロセッサは、さまざまなネットワーク通信要件を実装するために使用されます。一般的に使用されるプロセッサは次のとおりです:
Inサーバーに接続されている各クライアントに応答するには、サーバーは接続応答プロセッサをリスニング ソケットに関連付ける必要があります。
クライアントからコマンド要求を受信するには、サーバーはコマンド要求ハンドラーをクライアント ソケットに関連付ける必要があります。
コマンドの実行結果をクライアントに返すために、サーバーはコマンド応答プロセッサをクライアントソケットに関連付ける必要があります。
接続応答プロセッサ
networking.c の acceptTcpHandler 関数は、Redis の接続応答プロセッサです。このプロセッサは、サーバーのリスニング ソケットに接続するクライアントに応答するために使用されます。具体的な実装は次のとおりです。以下のように sys/socket.h/accept 関数のラッパー。
Redis サーバーが初期化されると、プログラムはこの接続応答プロセッサをサーバー リスニング ソケットの AE_READABLE イベントに関連付けます。クライアントが sys/socket.h/connect 関数を使用してサーバー リスニング ソケットに接続するとき、図に示すように、ソケットは AE_READABLE イベントを生成し、接続応答プロセッサの実行をトリガーし、対応するソケット応答操作を実行します。
コマンド リクエスト プロセッサ
networking.c の readQueryFromClient 関数は、Redis のコマンド リクエスト プロセッサであり、ソケットからの読み取りを担当します。クライアントによって送信されたコマンド リクエストのコンテンツは、unistd.h/read 関数のラッパーとして具体的に実装されます。
クライアントが接続応答プロセッサを介してサーバーに正常に接続すると、サーバーはクライアント ソケットの AE_READABLE イベントをコマンド リクエスト プロセッサに関連付けます。クライアントがコマンド リクエストをサーバーに送信すると、ソケットは図に示すように、AE_READABLE イベントが生成され、コマンド要求プロセッサの実行がトリガーされ、対応するソケット読み取り操作が実行されます。
#クライアントがサーバーに接続するプロセス全体を通じて、サーバーは常にコマンド要求プロセッサをクライアント ソケットの AE_READABLE イベントに関連付けます。
コマンド応答プロセッサ
networking.c の sendReplyToClient 関数は、Redis のコマンド応答プロセッサであり、コマンドの実行後にサーバーが取得したコマンド応答をクライアントに返す役割を果たします。これは特に unistd.h/write 関数のラッパーとして実装されています。
サーバーにクライアントに送信する必要があるコマンド応答がある場合、サーバーはクライアント ソケットの AE_WRITABLE イベントをコマンド応答プロセッサに関連付けます。クライアントがコマンド応答を受信する準備が整うと、サーバーはクライアント ソケットの AE_WRITABLE イベントをコマンド応答プロセッサに関連付けます。図に示すように、サーバーに接続すると、AE_WRITABLE イベントが生成され、コマンド応答プロセッサの実行がトリガーされ、対応するソケット書き込み操作が実行されます。
コマンド応答が送信されると、サーバーはクライアント ソケットの AE_WRITABLE イベントからコマンド応答プロセッサの関連付けを解除します。
完全なクライアント/サーバー接続イベントの例
Redis サーバーが実行中であると仮定すると、このサーバーのリスニング ソケットの AE_READABLE イベントはリスニング状態になる必要があり、このイベントは対応するプロセッサは接続応答プロセッサです。
この時点で Redis クライアントが Redis サーバーへの接続を開始すると、リスニング ソケットは AE_READABLE イベントを生成し、接続応答プロセッサの実行をトリガーします。プロセッサはクライアントの接続要求に応答し、その後create クライアント ソケットおよびクライアント ステータスを作成し、クライアント ソケットの AE_READABLE イベントをコマンド リクエスト プロセッサに関連付けて、クライアントがコマンド リクエストをメイン サーバーに送信できるようにします。
その後、クライアントは Redis サーバーにコマンド リクエストを送信し、クライアント ソケットは AE_READABLE イベントを生成し、コマンド リクエスト プロセッサの実行をトリガーします。プロセッサはクライアントのコマンド コンテンツを読み取り、それを渡します。関連するプログラムにアクセスして実行します。
コマンドを実行すると、対応するコマンド応答が生成されます。これらのコマンド応答をクライアントに送信するために、サーバーはクライアント ソケットの AE_WRITABLE イベントをコマンド応答プロセッサに関連付けます。コマンドが応答すると、クライアント ソケットは AE_WRITABLE イベントを生成し、コマンド応答プロセッサの実行をトリガーします。コマンド応答プロセッサがすべてのコマンド応答をソケットに書き込むと、サーバーはクライアント ソケットの AE_WRITABLE を解放します。イベント間の関連付けおよびコマンド応答ハンドラー。
関連する推奨事項: redis データベース チュートリアル
以上がRedis がシングルスレッドと言われるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。