Redis がシングルスレッドと言われるのはなぜですか?
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redisを使用して操作をロックするには、setnxコマンドを介してロックを取得し、有効期限を設定するために有効期限コマンドを使用する必要があります。特定の手順は次のとおりです。(1)SETNXコマンドを使用して、キー価値ペアを設定しようとします。 (2)expireコマンドを使用して、ロックの有効期限を設定します。 (3)Delコマンドを使用して、ロックが不要になったときにロックを削除します。

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

Redisは、メッセージミドルウェアとして、生産消費モデルをサポートし、メッセージを持続し、信頼できる配信を確保できます。メッセージミドルウェアとしてRedisを使用すると、低遅延、信頼性の高いスケーラブルなメッセージングが可能になります。
