不適切なコマンドを使用すると、クライアント ブロックが発生します:
keys *: すべてのキー操作を取得します;
Hgetall: ハッシュ テーブル内のすべてのフィールドの合計を返します;
smembers: セット内のすべてのメンバーを返します;
これらのコマンド複雑さは O(n) で、場合によってはテーブル全体がスキャンされることがあります。n が増加すると、時間の複雑さが増加し、クライアントがブロックされます。
Redis が RDB スナップショットを取得すると、システム関数 fork() が呼び出され、一時ファイルとトリガー条件の書き込みを完了する子スレッドが作成されることは誰もが知っています。設定ファイルに設定を保存します。
設定に達すると、bgsave コマンドがトリガーされてスナップショットが作成されます。このメソッドはメイン スレッドをブロックしませんが、save コマンドを手動で実行するとメイン スレッドで実行されます。ブロッキングメインスレッド。
大量の書き込み操作があり、同期永続性が設定されている場合、Redis が AOF ログを直接記録する場合
appendfsync always
つまり、データが保存されるたびに、変更が発生すると、すぐにディスクに記録されますが、ディスクへの書き込みには時間がかかり、パフォーマンスも低下するため、メインスレッドがブロックされる場合があります。
fork はファイルを書き換えるためのサブスレッドを作成します。BGREWRITEAOF
コマンドを実行すると、Redis サーバーは AOF を維持します。書き換えバッファ。子スレッドによる新しい AOF ファイルの作成中にサーバーによって実行されたすべての書き込みコマンドが記録されます。
子スレッドが新しい AOF ファイルの作成作業を完了すると、サーバーは書き換えバッファ内のすべての内容を新しい AOF ファイルの末尾に追加します。 AOF ファイルの保存 データベースの状態は、既存のデータベースの状態と一致します。
最後に、サーバーは古い AOF ファイルを新しい AOF ファイルに置き換えて、AOF ファイルの書き換え操作を完了します。
ステップ 2 でブロッキングが発生します。バッファ内の新しいデータを新しいファイルに書き込むときに、ブロッキングが発生します。
AOF のロギングは、リレーショナル データベースのようにコマンド実行前にログを記録するのではなく(障害回復を容易にするため)、コマンドを実行してから記録する方法を使用します。ログ。
その理由は、AOF ログではコマンドの構文チェックが実行されないため、追加のチェック オーバーヘッドが軽減され、現在のコマンドの実行はブロックされませんが、次の操作がブロックされる可能性があるためです。
これは、AOF ログもメイン スレッドで実行されるためです . ログ ファイルをディスクに書き込むときにディスク書き込み圧力が高いと、ディスク書き込みが非常に遅くなります。以降の操作が実行できなくなります。
大きなキーとは、キーの値が非常に大きいことを意味するのではなく、キーに対応する値が非常に大きいことを意味します。
大きなキーによって引き起こされるブロックの問題は次のとおりです:
クライアント タイムアウトのブロック: Redis 実行コマンドはシングルスレッドであるため、実行にはより時間がかかります。大きなキーを操作すると、Redis がブロックされ、クライアントの観点からは、長い間応答がなくなることになります。
ネットワーク輻輳の原因: 大きなキーを取得するたびに、生成されるネットワーク トラフィックが大きくなります。キーのサイズが 1 MB で、1 秒あたりのアクセス数が 1000 の場合、この場合、1 秒あたり 1000MB のトラフィックが生成され、これは通常のギガビット ネットワーク カードを搭載したサーバーにとっては致命的です。
ワーカー スレッドのブロック: del を使用して大きなキーを削除すると、ワーカー スレッドがブロックされ、後続のコマンドを処理できなくなります。
Redis に付属する --bigkeys
パラメーターを使用してビッグ キーを見つける場合は、次のオプションを選択するのが最善です。スレーブ ノード このコマンドをマスター ノードで実行すると、マスター ノードが ブロックされるためです。
オペレーティング システムは、解放されたメモリ ブロックを空きメモリ ブロックのリンク リストに挿入する必要があります。 、その後の管理と再配布用。このプロセス自体にはある程度の時間がかかり、現在メモリを解放しているアプリケーションを ブロックします。
そのため、一度に大量のメモリが解放されると、空きメモリ ブロックのリンク リストの動作時間が増加し、それに応じて Redisメイン スレッド のブロックが発生します。メインスレッドがブロックされると、他のすべてのリクエストがタイムアウトになる可能性があり、タイムアウトが増えると Redis 接続が枯渇し、さまざまな例外が発生します。
大きなキーを削除する場合は、バッチ削除と非同期削除を使用することをお勧めします。
データベースのクリアは、上記の bigkey の削除と同じです。Flushdb と Flushall では、すべてのキーと値のペアの削除と解放も行われますが、これも Redis のブロック ポイントです。
Redis クラスターはノードを動的に拡張および縮小できます。このプロセスは現在 半自動状態にあり、手動介入が必要です。
拡張・縮小の場合はデータ移行が必要となります。移行の一貫性を確保するために、Redis のすべての移行操作は 同期 操作です。
移行を実行するとき、両端の Redis はさまざまな長さの blocking 状態に入ります。キーが小さい場合、この時間は無視できますが、キーのメモリ使用量が大きすぎる場合は、 、深刻 場合によっては、クラスター内のフェイルオーバーがトリガーされ、不必要な切り替えが発生することがあります。
以上がRedis がブロックされる状況は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。