この記事では、Redis の 3 つの一般的なキャッシュ異常、キャッシュの侵入、キャッシュのブレークダウン、キャッシュなだれについて説明します。これらを通じて、Redis のホット キー ストレージの問題について説明します。 !
関連する推奨事項: 「Redis キャッシュの一貫性、キャッシュの侵入、キャッシュのブレークダウン、キャッシュ アバランシェの問題の分析 」
キャッシュの侵入、キャッシュの破壊、キャッシュなだれは、Redis のインタビューや実際の開発の際に考慮する必要があることが多い問題です。多くの人は、この問題の起源、原因、解決策についてまだ明確にしていません。実際、生成された原理を注意深く分析することで、これら 3 つの状況に対する適切な解決策を見つけることができます。 [関連する推奨事項: Redis ビデオ チュートリアル ]
この記事は、定義、ケース、危険性、解決策を通じて、これら 3 つの問題をすばやく理解するのに役立ちます。
あなたも、これら 3 つの問題に対する多くの解決策をインターネット上で目にしたことがあるかと思いますが、これらの解決策のいくつかは 正しい解決策ですか?この記事では、そのようなソリューションの長所と短所を 1 つずつ分析します。
。 例: クライアントが製品の詳細を要求すると、製品 ID が送信されますが、この時点では、製品 ID は (キャッシュにもデータベースにも) 存在しません。その結果、この ID を持つ製品のデータが要求されるたびに、データベースに送信されます。
ハザード: 要求されたパラメーターに対応するデータがまったく存在しないため、毎回データベースが要求され、データベースへの負荷が増大したりサービスがクラッシュしたり、さらには他のビジネス モジュールに影響を与えたりすることもあります。これは、ユーザー
が悪意のあるリクエスト を行った場合によく発生します。
1. 要求されたパラメーターに基づいて null 値をキャッシュします。この値に有効期限を設定すると、時間を短く設定できます。
2. ブルーム フィルターを使用します。まずブルーム フィルターでフィルターします。フィルターにブルーム フィルターが存在する場合は、データベースにクエリを実行してから、キャッシュに追加します。存在しない場合は、クライアントデータが存在しないことを直接返します。
3. キャッシュの侵入はユーザーによって開始された悪意のあるリクエストである可能性があるため、ユーザー IP を記録し、悪意のある IP リクエストをブロックすることができます。
スキーム分析:
まず、リクエスト レベルで 3 番目のソリューションを追加し、一部の悪意のあるリクエストを制御するための電流制限メカニズムと IP ブラックリスト メカニズムを作成し、誤った判断があった場合には IP ブロック解除などの操作を実装します。 。キャッシュ層は最初のソリューションを使用して実装されます。適切なキャッシュ時間を設定します。 誤った判断が許容されるビジネス シナリオの場合は、2 番目のソリューションを直接使用できます。完全に Redis に基づいているため、システムの複雑さが軽減されます。 本当の問題は、キーが存在してもキャッシュに存在しないため、データベース操作が発生することです。 解決策: プログラム分析: スキームの概要: 例: 電子商取引システムでは、特定のカテゴリの商品データがキャッシュ内で無効です。ただし、現在のシステムからのリクエストの多くは、このカテゴリの製品データに対するものです。これにより、すべてのリクエストがデータベース クエリを通過するようになります。 危険性: 瞬時に大量のリクエストが殺到するため、各リクエストをデータベース内でクエリする必要があります。データベースへのトラフィックの瞬間的な流入は、データベースへの負担を大幅に増大させ、直接的なデータベース麻痺を容易に引き起こす可能性があります。 1. キャッシュ時間はランダムです。特定の時刻に多数のキャッシュが期限切れになるため、キャッシュの期限切れ時間が比較的集中していることを意味します。有効期限を焦点を当てずにランダムに直接設定します。この方法では、キャッシュの有効期限があまり集中せず、データベースに対するクエリ操作のリクエストが同時に大量に発生することもありません。 2. マルチレベルキャッシュ。単に Redis に依存してキャッシュするのではなく、memcached をキャッシュに使用することもできます (これは単なる例であり、他のキャッシュ サービスも使用できます)。データをキャッシュする場合は、Redis 用のキャッシュと memcached 用のキャッシュを作成します。 Redis が失敗した場合は、memcached を使用できます。 3. ミューテックス ロック。キャッシュの内訳でミューテックス ロックの使用について説明しましたが、アバランシェの場合にもミューテックス ロックを使用できます。 4. 有効期限フラグを設定します。実際、キャッシュの内訳で説明した永久的な無期限を使用することもできます。リクエスト時に有効期限が決定され、有効期限が近づくと有効期限フラグが設定され、独立したスレッドがトリガーされてキャッシュが更新されます。 スキーム分析: 最初のスキームでは乱数のキャッシュ時間を使用し、キーの有効期限を確実に分散させます。難しいのはキャッシュ時間をどのように設定するかですが、キャッシュ時間が短く、データ量が非常に多い一部のデータの場合、このソリューションでは適切な時間制御が必要です。 2 番目のソリューションでは、マルチレベル キャッシュを使用して、すべてのリクエストがキャッシュされるようにします。ただし、これにより、システムのアーキテクチャの難しさが増し、マルチレベルの更新のキャッシュなど、その他のさまざまな問題が発生します。 3 番目のオプションはミューテックス ロックを使用します。ミューテックス ロックについてはキャッシュ ブレークダウンで説明しました。雪崩シナリオで使用できますが、これにより大量の配布が生成されます。スタイル ロック。 4 番目のソリューションでは、論理キャッシュ時間を使用します。これにより、システムのキャッシュ圧力が十分に保証されます。 計画の概要: 実際のプロジェクトでは、1 番目、2 番目、4 番目のオプションを使用して試してみることをお勧めします。どちらが良いでしょう。 プログラミング入門をご覧ください。 !
#キャッシュ ブレークダウン
定義: 特定のホット キーが存在しないためにキャッシュ ブレークダウンが発生し、データベースがアクセスしてください。データベースに対する負荷が増大します。この圧力は一時的な場合もあれば、長期間続く場合もあります。
#キャッシュ雪崩定義: 前述のキャッシュの故障は、キャッシュ内の特定のホット スポットが原因です。キーが失敗すると、大量のリクエストがデータベースに送信されます。ただし、キャッシュ雪崩は実際には同じですが、こちらの方が深刻で、1 つまたは 2 つのキーではなく、キャッシュされたキーのほとんどが無効です。
#概要
プログラミング関連の知識について詳しくは、
以上がRedis のホット キー ストレージの問題を分析し、例外をキャッシュするための解決策について説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。