ホームページ  >  記事  >  データベース  >  Redis におけるキャッシュの侵入、キャッシュなだれ、キャッシュのブレークダウン、キャッシュの一貫性について話しましょう。

Redis におけるキャッシュの侵入、キャッシュなだれ、キャッシュのブレークダウン、キャッシュの一貫性について話しましょう。

青灯夜游
青灯夜游転載
2021-11-24 19:42:042038ブラウズ

この記事では、Redis におけるキャッシュペネトレーション、キャッシュアバランシェ、キャッシュブレークダウン、キャッシュ一貫性について簡単に理解し、キャッシュペネトレーションとキャッシュアバランチの解決策を紹介します。

Redis におけるキャッシュの侵入、キャッシュなだれ、キャッシュのブレークダウン、キャッシュの一貫性について話しましょう。

キャッシュ雪崩

キャッシュは広い領域で同時に障害が発生し、後続のリクエストがデータベースに降りかかり、データベースが使用できなくなります。

たとえば、電子商取引のホームページでは、すべてのホームページの主要な有効期限は 12 時間で、正午に更新されます。 0:00のフラッシュセールイベントで大量のユーザーが殺到しますが、その時点でキャッシュ内のすべてのキーが無効であるため、すべてのリクエストがデータベースに落ち、データベースが処理できなければクラッシュするだけです。または、redis がダウンしている場合、大量のリクエストが mysql に送信され、mysql がハングアップします。 [関連する推奨事項: Redis ビデオ チュートリアル ]

解決策

  • したがって、この場合、各キーの有効期限を追加する必要があります。ランダム値同時に多数のキー障害が発生するのを避けるため、Redis クラスターのデプロイメントの場合、ホットスポット データを異なるライブラリに分散できます。

  • #事前に: Redis クラスターの高可用性を確保し、マシンのダウンタイムをできるだけ早く補い、適切なメモリ削減戦略を選択するようにしてください。

  • 進行中: mysql クラッシュを回避するためのローカル ehcache キャッシュ hystrix の現在の制限とダウングレード

  • その後: Redis 永続化メカニズムによって保存されたデータは、できるだけ早くキャッ​​シュに復元されます。

キャッシュ侵入

要求されたキーの多くがキャッシュに存在しません。たとえば、ハッカーがキャッシュに存在しないキーを作成し、攻撃を開始します。大量のリクエストが発生し、その結果、大量のリクエストがデータベースにドロップされます。

解決策

  • まず、基本的な入力パラメータの検証を実行し、不正なパラメータを直接インターセプトする必要があります。たとえば、データベース ID を 0 未満にすることはできないというクエリを実行し、検証します。電子メール アドレス 形式など

  • #キャッシュにもデータベースにも特定のキーのデータが見つからない場合は、キーを Redis に書き込み、値は null になり、有効期限を設定します次のリクエストを回避する時間になり、データベースに落ちます。
  • ブルーム フィルターを介して、ブルーム フィルターは、大量のデータの中に特定のデータが存在するかどうかを非常に簡単に判断できます。リクエストが来たときに、考えられるすべてのリクエスト値をブルーム フィルターに保存できます。では、まずユーザーから送信されたリクエストがブルーム フィルターに存在するかどうかを判断し、存在しない場合は直接インターセプトします。
  • キャッシュ ブレークダウン

キャッシュ ブレークダウンとは、常に大規模な同時実行を実行するキーの非常にホット スポットを指し、大規模な同時実行がこのポイントへのアクセスに集中します。キーの有効期限が切れると、継続的に大規模な同時実行がキャッシュを突破し、データベースに直接要求します。

キャッシュの一貫性

強い一貫性が必要な場合、強い一貫性が保証されていないため、キャッシュは使用できません。最終的な一貫性のみが保証されます。

最初にキャッシュを削除してからデータベースを更新します
  • データベースの更新が失敗した場合、データベースには古いデータが残っており、redis は空であり、データは保存されません。空のデータを読み取ると、データベースに移動してクエリが実行され、キャッシュが更新されます。

キューに参加してシリアル化操作を実行します
  • 最初にキャッシュを削除してから、データベースを更新します。キャッシュの削除など、同時実行性の高いシナリオでも問題が発生する可能性があります。データベースはまだ更新されていません。別のスレッドが入ってきて、redis が空であることがわかります。データベースを読み取り、redis を更新します。このとき、キャッシュされたスレッドが削除され、データベースが更新されます。これにより、次のような問題が発生します。このとき、データの更新操作をキューに入れるとシリアル化操作は発生しなくなりますが、これは効率が低下するため、通常はお勧めできません。

プログラミング関連の知識について詳しくは、

プログラミング入門

をご覧ください。 !

以上がRedis におけるキャッシュの侵入、キャッシュなだれ、キャッシュのブレークダウン、キャッシュの一貫性について話しましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。