Redisの非同期メカニズムとは何ですか

王林
リリース: 2023-06-01 20:14:40
転載
1314 人が閲覧しました

1. Redis のブロック ポイント

Redis インスタンスと対話するオブジェクト、および対話中に発生する操作:

  • クライアント: ネットワーク IO、キー値 追加の場合、削除、変更、クエリ操作、データベース操作;

  • ディスク: RDB スナップショットの生成、AOF ログの記録、AOF ログの書き換え;

  • Master-スレーブ ノード: メイン ライブラリは RDB ファイルの生成と送信、ライブラリからの RDB ファイルの受信、データベースのクリア、RDB ファイルのロードを行います;

  • スライシング クラスタ インスタンス: ハッシュ スロット情報を他のノードに送信しますインスタンス、データ移行。

4 クラス インタラクション オブジェクトと特定の操作との関係:

Redisの非同期メカニズムとは何ですか

クライアントとのインタラクション時のブロック ポイント:

ネットワーク IO は時々遅くなることがありますが、Redis は IO 多重化メカニズムを使用して、メインスレッドがネットワーク接続やリクエストの到着を待機することを回避するため、ネットワーク IO 要因ではありません。 Redis がブロックされる原因となります。

Redis メイン スレッドの主なタスクは、クライアントと対話するキーと値のペアの追加、削除、変更、およびクエリ操作を実行することです。非常に複雑な追加、削除、変更、クエリ操作は確実に Redis をブロックします。

操作の複雑さを判断する基準: 操作の 複雑さが O(N) であるかどうかを確認します。

Redis の最初の障害点: フルセット クエリと集計操作:

Redis のコレクションに関係する操作の複雑さは通常 O(N) であるため、使用する場合は注意が必要です。
たとえば、セット要素完全なクエリ操作 HGETALL、SMEMBERS、および 集計統計交差、和集合、差分などのセットの操作。

Redis の 2 番目のブロック ポイント: bigkey 削除操作

コレクション自体の削除操作にも潜在的なブロック リスクがあります。削除操作の本質は、キーと値のペアが占有しているメモリ空間を解放することです。メモリの解放は最初のステップにすぎません。メモリ空間をより効率的に管理するために、アプリケーションがメモリを解放するとき、オペレーティング システムは、その後の管理と再割り当てのために、解放されたメモリ ブロックを空きメモリ ブロックのリンク リストに挿入する必要があります。

この処理自体にある程度の時間がかかり、現在メモリを解放しているアプリケーションをブロックしてしまうため、一度に大量のメモリを解放すると空きメモリブロックリンクリストの動作時間が長くなります。これにより、Redis メインスレッドが失敗します。

大量のメモリを解放する時期: 多数のキーと値のペアを削除する場合、多数の要素を含むコレクションを削除することは、bigkey 削除とも呼ばれます。

要素数が異なるコレクションを削除するときにかかる時間:

Redisの非同期メカニズムとは何ですか

3 つの結論が導き出されます:

  • 要素数が 100,000 から 100 万に増加すると、4 つの主要なコレクション タイプの削除時間は 5 倍から 20 倍近くに増加します。要素が大きくなるほど、削除にかかる時間も長くなります。

  • #100 万要素を含むセットを削除する場合、ハッシュ タイプの最大削除時間は絶対値 1.98 秒に達しました。通常の状況では、Redis の応答時間はマイクロ秒レベルですが、操作の実行に 2 秒近くかかる場合、メイン スレッドがブロックされますが、これは避けられません。

  • Redis の 3 番目の障害点: データベースのクリア

    キーと値のペアの頻繁な削除は潜在的な障害点であるため、Redis のデータベース レベルの操作では, データベースのフラッシュ (FLUSHDB や FLUSHALL 操作など) も、すべてのキーと値のペアの削除と解放を伴うため、ブロックされる可能性があります。
Redis の 4 番目の障害点: AOF ログ同期の書き込み

ディスク IO は一般に時間と労力がかかり、集中力が必要です。 Redis 開発者は、ディスク IO によってブロッキングが発生する可能性があることを以前から認識していました。そのため、Redis は、サブプロセスを使用して RDB スナップショット ファイルを生成し、AOF ログ書き換え操作を実行するように設計されています。子プロセスが実行を担当し、遅いディスク IO によってメイン スレッドがブロックされることはありません。

Redis が AOF ログを直接記録する場合、さまざまな書き込み戦略を使用してデータをディスクに書き込みます。同期ディスク書き込み操作には約 1 ~ 2 ミリ秒かかります。大量の書き込み操作を AOF ログに記録し、同期的に書き戻す必要がある場合、メイン スレッドがブロックされます。

Redis の 5 番目の障害点: スレーブ ライブラリからの RDB ファイルの読み込み

マスター/スレーブ クラスターでは、マスター ライブラリは RDB ファイルを生成し、それをスレーブ ライブラリに転送する必要があります。

メイン ライブラリのコピー プロセス中、

RDB ファイルの作成と送信は子プロセス

によって完了され、メイン スレッドはブロックされません。

しかし、RDB ファイルを受信した後、スレーブ ライブラリは FLUSHDB コマンドを使用して現在のデータベースをクリアする必要があり、これがたまたま 3 番目のブロッキング ポイントにヒットします。

現在のデータベースをクリアした後、スレーブ ライブラリは RDB ファイルをメモリにロードする必要があります。このプロセスの速度は、RDB ファイルのサイズに密接に関係しています。RDB ファイルが大きいほど、処理は遅くなります。ロードプロセス。

スライス クラスター インスタンスが相互作用するときのブロック ポイント

Redis スライシング クラスターをデプロイするとき、各 Redis インスタンスに割り当てられたハッシュ スロット情報を異なるインスタンス間で転送する必要があります。 ロード バランシングが必要な場合 または インスタンスが追加または削除されると 、データは異なるインスタンス間で移行されます。ただし、ハッシュ スロットの情報量は多くなく、データ移行は段階的に実行されるため、これら 2 種類の操作では Redis のメイン スレッドがブロックされるリスクはほとんどありません。

Redis Cluster ソリューションを使用し、bigkey を同時に移行すると、Redis Cluster は同期移行を使用するため、メイン スレッドがブロックされます。

5 つの障害点:

  • 完全なクエリと集計操作の収集、

  • bigkey の削除。

  • データベースをクリアします;

  • AOF ログ同期書き込み;

  • RDB ファイルを図書館 。

2. 非同期で実行できるブロック ポイント

操作のブロックを回避するために、Redis は非同期スレッド メカニズムを提供します:

Redis が開始されます。いくつかのサブシステム スレッドを実行し、メイン スレッドがこれらのタスクを実行する代わりに、いくつかのタスクをこれらのサブスレッドに渡してバックグラウンドで完了させます。これにより、メインスレッドのブロックが回避されます。

操作の非同期実行の要件:

非同期で実行できる操作は、Redis メイン スレッドのクリティカル パス上の操作ではありません (クライアントが Redis にリクエストを送信した後、データ結果を返す Redis 操作を待機します)。

Redisの非同期メカニズムとは何ですか

メイン スレッドがオペレーション 1 を受け取った後、オペレーション 1 はクライアントに特定のデータを返す必要はありません。メイン スレッドは、それをバックグラウンドのサブスレッドに渡すことができます。同時に、クライアントに「OK」の結果を返すだけです。
子スレッドが操作 1 を実行すると、クライアントは操作 2 を Redis インスタンスに送信します。クライアントは、操作 2 によって返されたデータ結果を使用する必要があります。操作 2 が結果を返さない場合、クライアントは常に待機することになります。州。

操作 1 は、クライアントに特定のデータを返す必要がないため、クリティカル パス上の操作とはみなされず、バックグラウンドのサブスレッドによって非同期に実行できます。
操作 2 は結果をクライアントに返す必要があります。これはクリティカル パス上の操作であるため、メインスレッドはこの操作を直ちに完了する必要があります。

  • Redis 読み取り操作は、クライアントが読み取り操作を送信した後、後続のデータ処理のために読み取りデータが返されるまで待機するため、典型的なクリティカル パス操作です。 Redis の最初の障害点である「コレクション全体のクエリと集計操作」は、どちらも読み取り操作を伴うため、非同期操作は実行できません。

  • 特定のデータ結果をクライアントに返す必要のない削除操作は、クリティカル パス操作ではありません。 「『ビッグキー削除』と『データベースクリアランス』にはどちらもデータの削除が含まれますが、クリティカルパス上にはありません。」バックグラウンドのサブスレッドを使用して、削除操作を非同期的に実行できます。

  • 「AOF ログ同期書き込み」では、データの信頼性を確保するために、Redis インスタンスは AOF ログ内の操作レコードがディスク上に配置されていることを確認する必要があります。インスタンスは待機しませんが、特定のデータ結果がインスタンスに返されます。したがって、子スレッドを開始して、AOF ログの同期書き込みを実行できます。

  • データ アクセス サービスをクライアントに提供するには、完全な RDB ファイルをロードする必要があります。この操作もクリティカル パス上の操作であり、スレーブ ライブラリのメインスレッドによって実行する必要があります。

「コレクション全体のクエリと集計操作」と「ライブラリからの RDB ファイルのロード」を除き、他の 3 つのブロック ポイントに関係する操作はクリティカル パス上にないので、 Redisの非同期サブルーチンを利用でき、スレッド機構を利用してbigkeyの削除、データベースのクリア、AOFログの同期書き込みを実現します。

3. 非同期サブスレッド メカニズム

Redis メイン スレッドが開始されると、オペレーティング システムによって提供される pthread_create 関数を使用して、 を担当する 3 つのサブスレッドを作成します。 AOF ログ書き込み操作、キーと値のペア 削除とファイルのクローズの非同期実行

メイン スレッドは、リンク リスト形式のタスク キューを通じて子スレッドと対話します。

キーと値のペアを削除してデータベースをクリアする操作を受け取ると、メインスレッドはその操作をタスクにカプセル化してタスクキューに入れ、完了メッセージをクライアントに返します。削除が完了したことを示します。

しかし、実際には、この時点では削除は実行されていません。バックグラウンドのサブスレッドがタスク キューからタスクを読み取った後、実際にキーと値のペアを削除し、対応するメモリ領域を解放し始めます。 。この非同期削除は、遅延削除 (遅延フリー) とも呼ばれます。

AOF ログが Everysec オプションで構成されている場合、メインスレッドは AOF ログの書き込み操作をタスクにカプセル化し、タスク キューに入れます。これを書き換える 1 つの方法は次のとおりです。 バックグラウンドのサブスレッドがタスクを読み取ると、それ自体が AOF ログへの記録を開始し、メインスレッドは AOF ログに依存せずに実行を継続できます。

Redis の非同期サブスレッド実行メカニズム:

Redisの非同期メカニズムとは何ですか

非同期のキーと値のペアの削除とデータベースのクリア操作は、Redis 4.0 以降で提供される機能です。Redis では、これら 2 つの操作を実行するための新しいコマンドも提供しています:

  • キーと値のペアの削除: いつコレクション型に削除する必要のある要素が多数ある (たとえば、数百万または数千万の要素がある) 場合は、UNLINK コマンドを使用することをお勧めします。

  • データベースをクリアします。FLUSHDB および FLUSHALL コマンドを使用できます。その後、ASYNC オプションを追加して、バックグラウンドのサブスレッドがデータベースを非同期にクリアできるようにします。

うわー

以上がRedisの非同期メカニズムとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!