ホームページ  >  記事  >  データベース  >  Redis キャッシュの雪崩、破壊、侵入を解決する方法

Redis キャッシュの雪崩、破壊、侵入を解決する方法

WBOY
WBOY転載
2022-11-03 17:23:551681ブラウズ

この記事では、Redis に関する関連知識を提供します。主に、Redis キャッシュ雪崩、ブレークダウン、および侵入に関連する問題の解決方法を紹介します。キャッシュ雪崩とは、大量のリクエストを指します。キャッシュされたデータは、 Redis がヒットできない、つまり Redis 内でデータが見つからないということですが、見てみましょう。

Redis キャッシュの雪崩、破壊、侵入を解決する方法

推奨学習: Redis ビデオ チュートリアル

1. キャッシュ アバランチ

1. とはキャッシュ雪崩?

キャッシュ雪崩とは、Redisのキャッシュされたデータにヒットできない、つまり##でデータが見つからない大量のリクエストを指します。 #Redis の場合、ビジネス システムはデータベースに対してのみクエリを実行できるため、すべてのリクエストがデータベースに送信されます。以下の図に示すように:

データベースは

Redis ほど大量のリクエストを処理できません。キャッシュ雪崩が発生するとデータベースがダウンすることは間違いなく、業務システムへの影響は避けられないため、キャッシュ雪崩が発生すると業務システムにとって致命的となることは間違いありません。

2. キャッシュ雪崩はなぜ起こるのでしょうか?

キャッシュ雪崩はどのような状況で発生しますか?要約すると、理由は 2 つあります。

  • 多数の

    Redis キャッシュ データの有効期限が同時に切れたため、すべてのリクエストが Redis# に送信されました。 ## 失敗します。ヒット データはデータベース内でのみクエリできます。

  • Redis

    サーバーがダウンしているため、すべてのリクエストを Redis 経由で処理できず、データベースに問い合わせてデータをクエリすることしかできません。

  • 3. キャッシュ雪崩を回避するにはどうすればよいですか?

キャッシュなだれの原因にはさまざまな解決策があります:

    ランダムなキャッシュ有効期限が多数ある場合、解決策は元の有効期限を追加することです。大量のキャッシュされたデータが同時に期限切れになるのを避けるため、ランダムな有効期限 (1 ~ 5 分のランダムな有効期限など)。
  • Redis

    によって引き起こされるキャッシュ雪崩を解決するには、データ同期のために事前に Redis マスター/スレーブ サーバーを設定します。 Redis サーバーがダウンタイムによりサービスを提供できない場合に、センチネルが Redis スレーブ サーバーをマスター サーバーに設定してサービスを提供し続けることができるように、センチネル メカニズムを構成します。

  • 2. キャッシュ ブレークダウン

1. キャッシュ ブレークダウンとは

キャッシュ ブレークダウンはキャッシュなだれに似ています。データの有効期限が切れており、キャッシュ ブレークダウンはホットスポット データの有効期限を指します。次の図に示すように、ホットスポット データに対するすべてのリクエストはデータベースで処理する必要があります:

2 . キャッシュの侵入を回避するにはどうすればよいでしょうか?

キャッシュの故障を解決する 3 つの方法:

有効期限を設定しない
  • 特定のデータがホット データであることが事前にわかっている場合は、キャッシュの故障の問題を避けるために、これらのデータの有効期限を設定することはできません。たとえば、フラッシュ セールの一部の商品は、フラッシュ セール中に多数のユーザーによってアクセスされます。この時点で、フラッシュ用の商品データを書き込むことができます。有効期限を設定するのではなく、売上を事前にキャッシュに保存します。

ミューテックス ロック
  • 特定のデータが大量にアクセスされることが事前にわかっている場合は、もちろん期限切れにならないように設定できますが、多くの場合、期限切れにならないように設定できます。 、事前に予測することはできませんが、この状況にどう対処すればよいでしょうか?

キャッシュの故障状況を分析してみましょう:

通常の状況では、特定の

Redis

キャッシュ データの有効期限が切れたときに、データに対するリクエストがある場合は、再クエリします。データベースに保存し、キャッシュに書き込むことで、後続のリクエストがデータベースに再度クエリを実行することなくキャッシュにヒットできるようになります。 リクエストが大量にあるためにホットスポット データの有効期限が切れると、リクエストがキャッシュにヒットできない場合、データベースがクエリされ、データが

Redis

に書き換えられます。 Redis以前は、他のリクエストが受信されると、データベースもクエリされていました。 わかりました。ホットスポット データの有効期限が切れた後、多くのリクエストがデータベースをクエリすることはわかっています。そのため、データベースをクエリするビジネス ロジックにミューテックス ロックを追加できます。ロックを取得したリクエストのみがデータベースをクエリできます。データは

Redis

に書き戻されますが、ロックを取得していない他のリクエストはデータの準備ができるまで待つことしかできません。 上記の手順を次の図に示します:

  • 論理有効期限の設定

ミューテックス ロックを使用するとキャッシュの故障の問題を非常に簡単に解決できますが、ロックを取得しないリクエストはキューに入れられ、パフォーマンスに影響します。キャッシュの故障を解決するもう 1 つの方法は、ビジネス データの冗長性に有効期限を追加することです。たとえば、次のデータでは、データの有効期限を示すために expire_at フィールドを追加しました。

{"name":"test","expire_at":"1599999999"}复制代码

このメソッドの実装プロセスを次の図に示します。

キャッシュ内のホットスポット データには冗長な論理有効期限がありますが、データは Redis有効期限を設定しない

リクエストが Redis でデータを取得するときに、論理有効期限が切れているかどうかを確認します。有効期限が切れていない場合は、有効期限が切れると、ロックを取得するために別のスレッドが開かれ、データベースにクエリを実行し、クエリされた最新のデータを Redis に書き戻し、現在のリクエストはクエリされたデータを返します。

3. キャッシュ ペネトレーション

1. キャッシュ ペネトレーションとは

キャッシュ ペネトレーションとは、検索対象のデータがキャッシュにもデータベースにも存在しないことを意味します。 Redis次の図に示すように、キャッシュは名前だけです:

2. キャッシュペネトレーションが発生する理由

キャッシュペネトレーションはどのような状況で発生しますか?主に 3 つの状況があります:

  • 悪意のあるユーザーの攻撃要求

  • Redis とデータベース内のデータの悪意のある操作削除されました

  • ユーザーが記事リストなどのコンテンツをまだ生成していない場合、ユーザーは記事を書いていないため、キャッシュとデータベースにデータはありません

3. キャッシュの侵入を回避するにはどうすればよいですか?

a. キャッシュの空の値またはデフォルト値

Redis キャッシュにデータをクエリできない場合は、データベースから再度クエリします。データがない場合は、スペースまたはデフォルト値を直接キャッシュして、次回データベースへのクエリを回避します。ただし、データベースがデータベースに応答して null 値を返すことを防ぐために、キャッシュに有効期限を設定するか、対応するデータをキャッシュする必要があります。データ生成時に直接クリアされるため、空の値をキャッシュします。

b. ブルーム フィルター

null 値をキャッシュすることでキャッシュ侵入の問題は解決できますが、データが存在するかどうかを確認するためにデータベースに一度クエリを実行する必要があります。ユーザーによる同時実行性の高さ システム内に存在しないデータ ID を使用してクエリを実行するには、すべてのクエリがデータベースを通過する必要があり、データベースに大きな負荷がかかります。

それでは、データベースにクエリを行わずにデータが存在するかどうかを確認する方法はあるのでしょうか?はい、ブルームフィルターを使用してください。

ブルーム フィルターは主に 2 つの部分で構成されています: ビット配列 N ハッシュ関数原理は次のとおりです:

  • N ハッシュ関数を使用して、データがハッシュ化されていることをマークします。

  • 計算されたハッシュ値をビット配列の長さで割って取得し、ビット配列内の各ハッシュ値の位置を取得します。

  • ビット配列内の対応する位置を 1 としてマークします。

ブルーム フィルターの原理の概略図を以下に示します。

データを書き込む場合は、説明されている手順を実行します。上記を計算すると、ビット配列の位置に対応し、1とマークされます。クエリを実行すると、データが存在するかどうかを確認できます。

また、ハッシュ衝突問題によるエラーのため、ブルームフィルター通過後に存在しないデータが存在すると判断され、データベースがチェックされますが、ハッシュ衝突の確率はブルーム フィルターを使用すると、ほとんどの侵入リクエストを阻止できるようになります。

Redis 自体がブルーム フィルターをサポートしているため、自分で実装することなく Redis ブルーム フィルターを直接使用でき、非常に便利です。

4. 概要

キャッシュ雪崩、ブレークダウン、およびペネトレーションは、ビジネス アプリケーションをキャッシュするときによく発生するキャッシュ例外の問題であり、その原因と解決策は次のとおりです。

##問題原因解決策キャッシュ雪崩A大量のデータの有効期限が切れるか、サーバーがクラッシュするキャッシュの内訳ホットスポット データの有効期限1. 有効期限を設定しない 2. ミューテックス ロックを追加する 3. 冗長な論理有効期限 キャッシュの侵入データベースと 推奨される学習: Redis ビデオ チュートリアル
Redis1. ランダムな有効期限 2. マスター/スレーブセンチネルクラスター
Redis 1 で利用できないデータを要求します1. キャッシュの空の値またはデフォルト値 2. ブルーム フィルター

以上がRedis キャッシュの雪崩、破壊、侵入を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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