この記事では主に、Redis におけるキャッシュの侵入、キャッシュのクラッシュ、キャッシュの故障について紹介します。
記事ディレクトリ
キャッシュ
キャッシュの役割は?
通常の状況では、ユーザーがバックグラウンドでリクエストを行うと、データは最初にキャッシュからフェッチされます。データがキャッシュからフェッチされた場合は、
結果が直接返されます。データがフェッチできない場合は、データベースにクエリを実行する必要があり、データベースからフェッチされたデータはキャッシュに同期して更新され、結果が返されます。次のユーザーはキャッシュから値を直接取得できます。データベースに取得されない場合は、空の結果を直接返すことしかできません。
したがって、キャッシュの主な機能は、データの負荷圧力を軽減し、リクエスト応答の効率を向上させることです。
キャッシュの侵入
キャッシュペネトレーションとは何ですか?
キャッシュの侵入:存在してはいけないデータのクエリを指します。キャッシュはミスであるため、
データベースからクエリする必要があります。データが見つからない場合、データはキャッシュに書き込まれません。これにより、 - 既存のデータは
、クエリが要求されるたびにデータベースに送信されるため、データベースに負荷がかかります。
キャッシングの原因は?
- ビジネス設計は不合理です。たとえば、ほとんどのユーザーはガードを有効にしていませんが、各リクエストはキャッシュされ、
特定のユーザー ID がガードされているかどうかをクエリできます。 - 業務・運用・保守・開発上のエラー:キャッシュやデータベース内のデータを誤って削除するなど。
- ハッカーの違法なリクエスト攻撃: たとえば、ハッカーは、存在しないビジネス データを読み取るための大量の違法なリクエストを意図的に捏造します。
キャッシュの侵入を回避するにはどうすればよいでしょうか?
一般に次の 3 つの方法があります。
- インターフェースパラメータの検証: 不正なリクエストの場合、API エントリのパラメータを検証し、不正な値をフィルタリングします。一部の IP は処理され、ブラックリストに追加されます。
- キャッシュの null 値: クエリ データベースが空の場合、キャッシュに null 値またはデフォルト値を設定できます。ただし、書き込み要求が来た場合には、キャッシュの整合性を確保するためにキャッシュを更新する必要があり、同時に最後にキャッシュに適切な有効期限(30秒など)を設定する必要があります。これにより、攻撃ユーザーが ID を使用して繰り返しブルートフォース攻撃を行うことがなくなります。
- ブルーム フィルター: ブルーム フィルターを使用して、データが存在するかどうかをすばやく判断します。つまり、クエリリクエストが来ると、まずブルームフィルターで値が存在するかどうかを判断し、その後、値が存在するかどうかを確認し続けます。考えられるすべてのデータ ハッシュを十分な大きさのビットマップに保存すると、存在してはいけない一部のデータがこのビットマップによってインターセプトされるため、基盤となるストレージ システムに対するクエリの負荷が回避されます。
キャッシュ雪崩
キャッシュアバランチとは何ですか?
キャッシュ雪だるま式: キャッシュ内の大量のデータの有効期限を指しますが、クエリ データの量が膨大で、すべてのリクエストが
データベースに直接アクセスするため、データベースに過剰な負荷がかかり、場合によってはマシンがダウンし、データベースが使用できなくなります。 。
キャッシュ雪崩を解決するにはどうすればよいでしょうか?
- 同期ロックを使用して、データベースにクエリを実行するスレッドを制御します。同時実行性がそれほど高くない場合は、キューとロックを使用できます。同期ロックを使用して、
データベースにクエリを実行するスレッドを制御します。データベースにクエリを実行できるスレッドは 1 つだけです。クエリが取得された後、データはキャッシュに保存されます。 - 同じ種類の情報キーに異なる有効期限を設定する
同じ種類のキーに有効期限を設定する場合、ランダムな時間を追加して有効期限を異ならせます。 - キャッシュのウォームアップ
リクエストが到着してデータベースにクエリを実行してキャッシュに保存するまで待つ必要はなく、事前にデータをキャッシュに保存できます。キャッシュ ウォームアップ メカニズムを使用すると、通常、データベース内のデータをキャッシュに同期するための特別なバックグラウンド プログラムがあり、自動更新が採用されます。 - キャッシュ データベースが分散方式で展開されている場合、ホットスポット データを複数のノードに均等に分散できます。
キャッシュの内訳
キャッシュの内訳とは何ですか?
キャッシュの内訳: キャッシュに存在しない、または期限切れになったデータベース内のデータを指します。この時点では、同時ユーザーが多すぎて同時にキャッシュにデータが
読み込まれないため、データはキャッシュから直接フェッチされます。データベースに負荷がかかり、データベースに瞬間的な負荷がかかります。キャッシュ雪崩とは異なり、キャッシュ ブレークダウンは、同じデータを同時にクエリすることを指します。キャッシュ雪崩とは、異なるデータの有効期限が切れ、広い領域のデータをクエリできないため、データベースがクエリされることを意味します。
キャッシュの故障を解決するにはどうすればよいですか?
- ミューテックス スキームを使用して
キャッシュを無効にする場合は、データベース データをすぐにロードするのではなく、最初に (Redis ✁ setnx) など、正常に返されるアトミック操作コマンドを使用して操作し、キャッシュが成功したときにデータベース データと設定をロードします。それ以外の場合は、キャッシュの取得を再試行します。 - ホットスポット キーが期限切れにならない
ということは、有効期限が設定されていないことを意味しますが、ホットスポット データの有効期限が近づくと、非同期スレッドが更新されて有効期限が設定されます。 - システムのクラッシュを防ぐために、融合とダウングレードを適切に行う