この記事では、Redis に関する関連知識を提供します。主に、Redis キャッシュ雪崩、ブレークダウン、および侵入に関連する問題の解決方法を紹介します。キャッシュ雪崩とは、大量のリクエストを指します。キャッシュされたデータは、 Redis がヒットできない、つまり Redis 内でデータが見つからないということですが、見てみましょう。
推奨学習: Redis ビデオ チュートリアル
キャッシュ雪崩
とは、Redis
のキャッシュされたデータにヒットできない、つまり##でデータが見つからない大量のリクエストを指します。 #Redis の場合、ビジネス システムはデータベースに対してのみクエリを実行できるため、すべてのリクエストがデータベースに送信されます。以下の図に示すように:
Redis ほど大量のリクエストを処理できません。キャッシュ雪崩が発生するとデータベースがダウンすることは間違いなく、業務システムへの影響は避けられないため、キャッシュ雪崩が発生すると業務システムにとって致命的となることは間違いありません。
Redis キャッシュ データの有効期限が同時に切れたため、すべてのリクエストが
Redis# に送信されました。 ## 失敗します。ヒット データはデータベース内でのみクエリできます。
サーバーがダウンしているため、すべてのリクエストを Redis
経由で処理できず、データベースに問い合わせてデータをクエリすることしかできません。
によって引き起こされるキャッシュ雪崩を解決するには、データ同期のために事前に Redis
マスター/スレーブ サーバーを設定します。 Redis
サーバーがダウンタイムによりサービスを提供できない場合に、センチネルが Redis
スレーブ サーバーをマスター サーバーに設定してサービスを提供し続けることができるように、センチネル メカニズムを構成します。
2 . キャッシュの侵入を回避するにはどうすればよいでしょうか?
キャッシュの故障状況を分析してみましょう:
通常の状況では、特定の
Redis キャッシュ データの有効期限が切れたときに、データに対するリクエストがある場合は、再クエリします。データベースに保存し、キャッシュに書き込むことで、後続のリクエストがデータベースに再度クエリを実行することなくキャッシュにヒットできるようになります。 リクエストが大量にあるためにホットスポット データの有効期限が切れると、リクエストがキャッシュにヒットできない場合、データベースがクエリされ、データが
に書き換えられます。 Redis
以前は、他のリクエストが受信されると、データベースもクエリされていました。 わかりました。ホットスポット データの有効期限が切れた後、多くのリクエストがデータベースをクエリすることはわかっています。そのため、データベースをクエリするビジネス ロジックにミューテックス ロックを追加できます。ロックを取得したリクエストのみがデータベースをクエリできます。データは
に書き戻されますが、ロックを取得していない他のリクエストはデータの準備ができるまで待つことしかできません。 上記の手順を次の図に示します:
ミューテックス ロックを使用するとキャッシュの故障の問題を非常に簡単に解決できますが、ロックを取得しないリクエストはキューに入れられ、パフォーマンスに影響します。キャッシュの故障を解決するもう 1 つの方法は、ビジネス データの冗長性に有効期限を追加することです。たとえば、次のデータでは、データの有効期限を示すために expire_at
フィールドを追加しました。
{"name":"test","expire_at":"1599999999"}复制代码
このメソッドの実装プロセスを次の図に示します。
キャッシュ内のホットスポット データには冗長な論理有効期限がありますが、データは Redis
有効期限を設定しない
リクエストが Redis
でデータを取得するときに、論理有効期限が切れているかどうかを確認します。有効期限が切れていない場合は、有効期限が切れると、ロックを取得するために別のスレッドが開かれ、データベースにクエリを実行し、クエリされた最新のデータを Redis
に書き戻し、現在のリクエストはクエリされたデータを返します。
キャッシュ ペネトレーションとは、検索対象のデータがキャッシュにもデータベースにも存在しないことを意味します。 Redis
次の図に示すように、キャッシュは名前だけです:
キャッシュペネトレーションはどのような状況で発生しますか?主に 3 つの状況があります:
悪意のあるユーザーの攻撃要求
Redis
とデータベース内のデータの悪意のある操作削除されました
ユーザーが記事リストなどのコンテンツをまだ生成していない場合、ユーザーは記事を書いていないため、キャッシュとデータベースにデータはありません
Redis
キャッシュにデータをクエリできない場合は、データベースから再度クエリします。データがない場合は、スペースまたはデフォルト値を直接キャッシュして、次回データベースへのクエリを回避します。ただし、データベースがデータベースに応答して null 値を返すことを防ぐために、キャッシュに有効期限を設定するか、対応するデータをキャッシュする必要があります。データ生成時に直接クリアされるため、空の値をキャッシュします。
null 値をキャッシュすることでキャッシュ侵入の問題は解決できますが、データが存在するかどうかを確認するためにデータベースに一度クエリを実行する必要があります。ユーザーによる同時実行性の高さ システム内に存在しないデータ ID を使用してクエリを実行するには、すべてのクエリがデータベースを通過する必要があり、データベースに大きな負荷がかかります。
それでは、データベースにクエリを行わずにデータが存在するかどうかを確認する方法はあるのでしょうか?はい、ブルームフィルター
を使用してください。
ブルーム フィルターは主に 2 つの部分で構成されています: ビット配列 N ハッシュ関数原理は次のとおりです:
N ハッシュ関数を使用して、データがハッシュ化されていることをマークします。
計算されたハッシュ値をビット配列の長さで割って取得し、ビット配列内の各ハッシュ値の位置を取得します。
ビット配列内の対応する位置を 1 としてマークします。
ブルーム フィルターの原理の概略図を以下に示します。
データを書き込む場合は、説明されている手順を実行します。上記を計算すると、ビット配列の位置に対応し、1とマークされます。クエリを実行すると、データが存在するかどうかを確認できます。
また、ハッシュ衝突問題によるエラーのため、ブルームフィルター通過後に存在しないデータが存在すると判断され、データベースがチェックされますが、ハッシュ衝突の確率はブルーム フィルターを使用すると、ほとんどの侵入リクエストを阻止できるようになります。
Redis
自体がブルーム フィルターをサポートしているため、自分で実装することなく Redis
ブルーム フィルターを直接使用でき、非常に便利です。
キャッシュ雪崩、ブレークダウン、およびペネトレーションは、ビジネス アプリケーションをキャッシュするときによく発生するキャッシュ例外の問題であり、その原因と解決策は次のとおりです。
解決策 | ||
---|---|---|
Redis | サーバーがクラッシュする1. ランダムな有効期限 2. マスター/スレーブセンチネルクラスター |
キャッシュの内訳 |
1. 有効期限を設定しない 2. ミューテックス ロックを追加する 3. 冗長な論理有効期限 | キャッシュの侵入 | |
Redis | 1 で利用できないデータを要求します1. キャッシュの空の値またはデフォルト値 2. ブルーム フィルター |
以上がRedis キャッシュの雪崩、破壊、侵入を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。