Redis のイベント ループはスレッドで処理されます。シングル スレッド プログラムとして、イベント ループ内の後続のタスクがブロックされないように、イベント処理の遅延を確実に短くすることが重要です。 Redis データが特定のレベル (20G など) に達すると、ブロック操作がパフォーマンスに特に深刻な影響を及ぼします。
Redis での時間のかかるシナリオをまとめてみましょう。方法;
長時間かかるコマンドによりブロックが発生する
キー、ソート、その他のコマンド
キーコマンドは、指定されたパターンに一致するすべてのファイルを検索するために使用されます。パターン キーの時間計算量は O(N) で、N はデータベース内のキーの数です。データベース内のアイテム数が数千万に達すると、このコマンドにより読み取りスレッドと書き込みスレッドが数秒間ブロックされます。同様のコマンドには、sunion sort などの操作が含まれます。ビジネスでキーや並べ替えなどの操作を使用する必要がある場合はどうすればよいですか。要件?
解決策:
アーキテクチャ設計には、「迂回」というトリックがあります。これは、迅速に処理されるリクエストと処理されるリクエストを分離することを意味します。そうしないと、遅いものが速いものに影響を及ぼし、速いものが起動できなくなります。これは、redis の設計では非常に明白です。redis の純粋なメモリ操作と epoll のノンブロッキング IO イベント処理は、 1 つのスレッドで実行され、永続化、AOF の書き換え、マスターとスレーブの同期データなどの時間のかかる操作は、遅いプロセスの速度に影響を与えないように別のプロセスで処理する必要があります。キーなどの操作を使用する必要がある場合、特にキーや並べ替えなどの時間のかかる操作のために、別の Redis スレーブ ノードを開くなど、それらを取り除くことができます。これらのクエリは通常、オンラインのリアルタイム ビジネスではありません。クエリは遅くなります。主なことはタスクを完了することです。ただし、オンラインおよび高速消費タスクには影響しません。
smembers コマンド
smembers コマンドは完全なセットを取得するために使用され、時間計算量は O(N) です。N はコレクション内の数です。コレクションに数千万のデータが格納されている場合、取得によりイベント処理スレッドも長時間ブロックされています;
解決策:
sort や key などのコマンドとは異なり、smember はオンライン リアルタイムで非常に頻繁に使用されるコマンドかもしれませんアプリケーション シナリオ。ここでは流用は適していません。設計レベルからさらに検討する必要があります。設計中にセット数を制御でき、通常はセット数を 500 以内に抑えることができます。たとえば、1 つのキーを使用してデータを保存します。
コレクションを複数のサブコレクションに分割するのが難しい場合は、 を保存するために 1 つの大きなコレクションを使用することを主張し、セットをフェッチするときに SRANDMEMBER キー [count] を使用することを検討してください。指定された数をランダムに返します。もちろん、セット内のすべての要素を走査したい場合、このコマンドは適切ではありません;
以上がRedis がブロックされた場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。