この記事では、Redis におけるキャッシュペネトレーション、キャッシュアバランシェ、キャッシュブレークダウン、キャッシュ一貫性について簡単に理解し、キャッシュペネトレーションとキャッシュアバランチの解決策を紹介します。
キャッシュ雪崩
キャッシュは広い領域で同時に障害が発生し、後続のリクエストがデータベースに降りかかり、データベースが使用できなくなります。
たとえば、電子商取引のホームページでは、すべてのホームページの主要な有効期限は 12 時間で、正午に更新されます。 0:00のフラッシュセールイベントで大量のユーザーが殺到しますが、その時点でキャッシュ内のすべてのキーが無効であるため、すべてのリクエストがデータベースに落ち、データベースが処理できなければクラッシュするだけです。または、redis がダウンしている場合、大量のリクエストが mysql に送信され、mysql がハングアップします。 [関連する推奨事項: Redis ビデオ チュートリアル ]
解決策
キャッシュ侵入
要求されたキーの多くがキャッシュに存在しません。たとえば、ハッカーがキャッシュに存在しないキーを作成し、攻撃を開始します。大量のリクエストが発生し、その結果、大量のリクエストがデータベースにドロップされます。
解決策
- まず、基本的な入力パラメータの検証を実行し、不正なパラメータを直接インターセプトする必要があります。たとえば、データベース ID を 0 未満にすることはできないというクエリを実行し、検証します。電子メール アドレス 形式など
#キャッシュにもデータベースにも特定のキーのデータが見つからない場合は、キーを Redis に書き込み、値は null になり、有効期限を設定します次のリクエストを回避する時間になり、データベースに落ちます。 ブルーム フィルターを介して、ブルーム フィルターは、大量のデータの中に特定のデータが存在するかどうかを非常に簡単に判断できます。リクエストが来たときに、考えられるすべてのリクエスト値をブルーム フィルターに保存できます。では、まずユーザーから送信されたリクエストがブルーム フィルターに存在するかどうかを判断し、存在しない場合は直接インターセプトします。 キャッシュ ブレークダウン
キャッシュ ブレークダウンとは、常に大規模な同時実行を実行するキーの非常にホット スポットを指し、大規模な同時実行がこのポイントへのアクセスに集中します。キーの有効期限が切れると、継続的に大規模な同時実行がキャッシュを突破し、データベースに直接要求します。
キャッシュの一貫性
強い一貫性が必要な場合、強い一貫性が保証されていないため、キャッシュは使用できません。最終的な一貫性のみが保証されます。
最初にキャッシュを削除してからデータベースを更新します
- データベースの更新が失敗した場合、データベースには古いデータが残っており、redis は空であり、データは保存されません。空のデータを読み取ると、データベースに移動してクエリが実行され、キャッシュが更新されます。
キューに参加してシリアル化操作を実行します
- 最初にキャッシュを削除してから、データベースを更新します。キャッシュの削除など、同時実行性の高いシナリオでも問題が発生する可能性があります。データベースはまだ更新されていません。別のスレッドが入ってきて、redis が空であることがわかります。データベースを読み取り、redis を更新します。このとき、キャッシュされたスレッドが削除され、データベースが更新されます。これにより、次のような問題が発生します。このとき、データの更新操作をキューに入れるとシリアル化操作は発生しなくなりますが、これは効率が低下するため、通常はお勧めできません。
プログラミング関連の知識について詳しくは、
プログラミング入門
をご覧ください。 !
以上がRedis におけるキャッシュの侵入、キャッシュなだれ、キャッシュのブレークダウン、キャッシュの一貫性について話しましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。