Redis インスタンスと対話するオブジェクト、および対話中に発生する操作:
クライアント: ネットワーク IO、キー値 追加の場合、削除、変更、クエリ操作、データベース操作;
ディスク: RDB スナップショットの生成、AOF ログの記録、AOF ログの書き換え;
Master-スレーブ ノード: メイン ライブラリは RDB ファイルの生成と送信、ライブラリからの RDB ファイルの受信、データベースのクリア、RDB ファイルのロードを行います;
スライシング クラスタ インスタンス: ハッシュ スロット情報を他のノードに送信しますインスタンス、データ移行。
クライアントとのインタラクション時のブロック ポイント:
ネットワーク IO は時々遅くなることがありますが、Redis は IO 多重化メカニズムを使用して、メインスレッドがネットワーク接続やリクエストの到着を待機することを回避するため、ネットワーク IO は 要因ではありません。 Redis がブロックされる原因となります。
Redis メイン スレッドの主なタスクは、クライアントと対話するキーと値のペアの追加、削除、変更、およびクエリ操作を実行することです。非常に複雑な追加、削除、変更、クエリ操作は確実に Redis をブロックします。
操作の複雑さを判断する基準: 操作の 複雑さが O(N) であるかどうかを確認します。
Redis の最初の障害点: フルセット クエリと集計操作:
Redis のコレクションに関係する操作の複雑さは通常 O(N) であるため、使用する場合は注意が必要です。
たとえば、セット要素完全なクエリ操作 HGETALL、SMEMBERS、および 集計統計交差、和集合、差分などのセットの操作。
Redis の 2 番目のブロック ポイント: bigkey 削除操作
コレクション自体の削除操作にも潜在的なブロック リスクがあります。削除操作の本質は、キーと値のペアが占有しているメモリ空間を解放することです。メモリの解放は最初のステップにすぎません。メモリ空間をより効率的に管理するために、アプリケーションがメモリを解放するとき、オペレーティング システムは、その後の管理と再割り当てのために、解放されたメモリ ブロックを空きメモリ ブロックのリンク リストに挿入する必要があります。
この処理自体にある程度の時間がかかり、現在メモリを解放しているアプリケーションをブロックしてしまうため、一度に大量のメモリを解放すると空きメモリブロックリンクリストの動作時間が長くなります。これにより、Redis メインスレッドが失敗します。
大量のメモリを解放する時期: 多数のキーと値のペアを削除する場合、多数の要素を含むコレクションを削除することは、bigkey 削除とも呼ばれます。
要素数が異なるコレクションを削除するときにかかる時間:
3 つの結論が導き出されます:
要素数が 100,000 から 100 万に増加すると、4 つの主要なコレクション タイプの削除時間は 5 倍から 20 倍近くに増加します。要素が大きくなるほど、削除にかかる時間も長くなります。
RDB ファイルの作成と送信は子プロセス
によって完了され、メイン スレッドはブロックされません。しかし、RDB ファイルを受信した後、スレーブ ライブラリは FLUSHDB コマンドを使用して現在のデータベースをクリアする必要があり、これがたまたま 3 番目のブロッキング ポイントにヒットします。
現在のデータベースをクリアした後、スレーブ ライブラリは RDB ファイルをメモリにロードする必要があります。このプロセスの速度は、RDB ファイルのサイズに密接に関係しています。RDB ファイルが大きいほど、処理は遅くなります。ロードプロセス。 Redis スライシング クラスターをデプロイするとき、各 Redis インスタンスに割り当てられたハッシュ スロット情報を異なるインスタンス間で転送する必要があります。 ロード バランシングが必要な場合 または インスタンスが追加または削除されると 、データは異なるインスタンス間で移行されます。ただし、ハッシュ スロットの情報量は多くなく、データ移行は段階的に実行されるため、これら 2 種類の操作では Redis のメイン スレッドがブロックされるリスクはほとんどありません。 Redis Cluster ソリューションを使用し、bigkey を同時に移行すると、Redis Cluster は同期移行を使用するため、メイン スレッドがブロックされます。 5 つの障害点: 完全なクエリと集計操作の収集、 bigkey の削除。 データベースをクリアします; AOF ログ同期書き込み; RDB ファイルを図書館 。 操作のブロックを回避するために、Redis は非同期スレッド メカニズムを提供します: Redis が開始されます。いくつかのサブシステム スレッドを実行し、メイン スレッドがこれらのタスクを実行する代わりに、いくつかのタスクをこれらのサブスレッドに渡してバックグラウンドで完了させます。これにより、メインスレッドのブロックが回避されます。 操作の非同期実行の要件: 非同期で実行できる操作は、Redis メイン スレッドのクリティカル パス上の操作ではありません (クライアントが Redis にリクエストを送信した後、データ結果を返す Redis 操作を待機します)。 メイン スレッドがオペレーション 1 を受け取った後、オペレーション 1 はクライアントに特定のデータを返す必要はありません。メイン スレッドは、それをバックグラウンドのサブスレッドに渡すことができます。同時に、クライアントに「OK」の結果を返すだけです。 操作 1 は、クライアントに特定のデータを返す必要がないため、クリティカル パス上の操作とはみなされず、バックグラウンドのサブスレッドによって非同期に実行できます。 Redis 読み取り操作は、クライアントが読み取り操作を送信した後、後続のデータ処理のために読み取りデータが返されるまで待機するため、典型的なクリティカル パス操作です。 Redis の最初の障害点である「コレクション全体のクエリと集計操作」は、どちらも読み取り操作を伴うため、非同期操作は実行できません。 特定のデータ結果をクライアントに返す必要のない削除操作は、クリティカル パス操作ではありません。 「『ビッグキー削除』と『データベースクリアランス』にはどちらもデータの削除が含まれますが、クリティカルパス上にはありません。」バックグラウンドのサブスレッドを使用して、削除操作を非同期的に実行できます。 「AOF ログ同期書き込み」では、データの信頼性を確保するために、Redis インスタンスは AOF ログ内の操作レコードがディスク上に配置されていることを確認する必要があります。インスタンスは待機しませんが、特定のデータ結果がインスタンスに返されます。したがって、子スレッドを開始して、AOF ログの同期書き込みを実行できます。 データ アクセス サービスをクライアントに提供するには、完全な RDB ファイルをロードする必要があります。この操作もクリティカル パス上の操作であり、スレーブ ライブラリのメインスレッドによって実行する必要があります。 「コレクション全体のクエリと集計操作」と「ライブラリからの RDB ファイルのロード」を除き、他の 3 つのブロック ポイントに関係する操作はクリティカル パス上にないので、 Redisの非同期サブルーチンを利用でき、スレッド機構を利用してbigkeyの削除、データベースのクリア、AOFログの同期書き込みを実現します。 Redis メイン スレッドが開始されると、オペレーティング システムによって提供される pthread_create 関数を使用して、 を担当する 3 つのサブスレッドを作成します。 AOF ログ書き込み操作、キーと値のペア 削除とファイルのクローズの非同期実行。 メイン スレッドは、リンク リスト形式のタスク キューを通じて子スレッドと対話します。 キーと値のペアを削除してデータベースをクリアする操作を受け取ると、メインスレッドはその操作をタスクにカプセル化してタスクキューに入れ、完了メッセージをクライアントに返します。削除が完了したことを示します。 しかし、実際には、この時点では削除は実行されていません。バックグラウンドのサブスレッドがタスク キューからタスクを読み取った後、実際にキーと値のペアを削除し、対応するメモリ領域を解放し始めます。 。この非同期削除は、遅延削除 (遅延フリー) とも呼ばれます。 AOF ログが Everysec オプションで構成されている場合、メインスレッドは AOF ログの書き込み操作をタスクにカプセル化し、タスク キューに入れます。これを書き換える 1 つの方法は次のとおりです。
バックグラウンドのサブスレッドがタスクを読み取ると、それ自体が AOF ログへの記録を開始し、メインスレッドは AOF ログに依存せずに実行を継続できます。 Redis の非同期サブスレッド実行メカニズム: 非同期のキーと値のペアの削除とデータベースのクリア操作は、Redis 4.0 以降で提供される機能です。Redis では、これら 2 つの操作を実行するための新しいコマンドも提供しています: キーと値のペアの削除: いつコレクション型に削除する必要のある要素が多数ある (たとえば、数百万または数千万の要素がある) 場合は、UNLINK コマンドを使用することをお勧めします。 データベースをクリアします。FLUSHDB および FLUSHALL コマンドを使用できます。その後、ASYNC オプションを追加して、バックグラウンドのサブスレッドがデータベースを非同期にクリアできるようにします。 スライス クラスター インスタンスが相互作用するときのブロック ポイント
2. 非同期で実行できるブロック ポイント
子スレッドが操作 1 を実行すると、クライアントは操作 2 を Redis インスタンスに送信します。クライアントは、操作 2 によって返されたデータ結果を使用する必要があります。操作 2 が結果を返さない場合、クライアントは常に待機することになります。州。
操作 2 は結果をクライアントに返す必要があります。これはクリティカル パス上の操作であるため、メインスレッドはこの操作を直ちに完了する必要があります。
3. 非同期サブスレッド メカニズム
うわー
以上がRedisの非同期メカニズムとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。