1. 概念
キャッシュ ペネトレーションの概念は非常に単純で、ユーザーはデータをクエリしたいと考えており、 redis メモリ データベースにメモリがない、つまりキャッシュがヒットしないため、永続層データベースがクエリされます。何も存在しないことが判明したため、このクエリは失敗しました。ユーザーが多い場合、キャッシュがヒットしないため、すべてのユーザーが永続化レイヤー データベースを要求します。キャッシュの侵入が発生すると、永続層データベースに大きな負担がかかります。
キャッシュ ブレークダウンとキャッシュ ブレークダウンの違いに注意する必要があります。キャッシュ ブレークダウンとは、非常にホットで常に大量の同時実行を実行するキーを指します。大規模な同時実行は、このポイントへのアクセスに集中します。このキーの有効期限が切れた瞬間、連続的な大規模な同時実行がキャッシュを突破してデータベースに直接リクエストします。これは、バリアに穴を開けるようなものです。
キャッシュの侵入を回避するための解決策は実際にはたくさんあります。以下にいくつか紹介します。
2. 解決策
(1) ブルームフィルター
統計によると、世界中のスパム Web サイトと通常の Web サイト合計で数十億の Web サイトがあり、ブルーム フィルターはこの規模のデータに適用できるデータ構造です。ブルーム フィルターを使用すると、インターネット警察がデータベース内のスパム Web サイトを 1 つずつ比較する必要がなくなります。 1 億件のスパム Web サイトのアドレスを保存するとします。
1 億のバイナリ ビットから開始すると、ネットワーク警察は 8 つの異なる乱数発生器 (F1、F2、…、F8) を使用して 8 つの情報フィンガープリント (f1、f2、…、f8) を生成します。次に、乱数発生器 G を使用して、これら 8 つの情報フィンガープリントを 1 から 1 億までの 8 つの自然数 g1、g2、…、g8 にマッピングします。最後に、これら 8 つの位置のバイナリ値を 1 に設定します。
ある日、インターネット警察は不審な Web サイトを発見し、それが XX Web サイトであるかどうかを確認したいと考えていました。不審な Web サイトは 1 億ビット配列上の 8 つのポイントにハッシュ化されました。 1 ではない点がある場合、その要素がセット内に存在しないことがわかります。
それでは、この Bloom フィルターは Redis でのキャッシュの侵入をどのように解決するのでしょうか?それは非常に単純です。まず、考えられるすべてのクエリ パラメータはハッシュ形式で保存されます。ユーザーがクエリを実行したい場合、ブルーム フィルタを使用してコレクションにないことを確認し、永続層にクエリを実行せずに直接破棄します。 。
#このフォームは非常にシンプルです。2. 空のオブジェクトをキャッシュする
ストレージ層がミスした場合、返された空のオブジェクトもキャッシュされ、有効期限が設定されます。キャッシュから取得し、バックエンド データ ソースを保護します
#しかし、この方法には次の 2 つの問題があります。
キャッシュ雪崩とは、キャッシュ層にエラーが発生し、正しく動作できないことを意味します。したがって、すべてのリクエストがストレージ層に送信されるため、ストレージ層の呼び出し量が大幅に増加し、ストレージ層がクラッシュする可能性があります。
#2. ソリューション
# (1) Redis の高可用性
#このアイデアの意味は、redis がハングアップする可能性があるため、さらにいくつかの redis を追加して、1 つがハングアップした後も他の redis が引き続き動作できるようにするということです。実際には、これはクラスターです。
(2) 電流制限ダウングレードこのソリューションのアイデアは、ロックまたはキュー メソッドを使用して、データベースの読み取りと書き込みを行うスレッドを制御することです。キャッシュの有効期限が切れた後のキャッシュ。たとえば、特定のキーを操作するためにデータのクエリとキャッシュの書き込みを許可されるのは 1 つのスレッドだけであり、他のスレッドは待機する必要があります。
(3) データ ウォームアップデータ ウォームアップの意味は、正式な展開の前に、まず事前に可能なデータにアクセスして、パーツは大量にアクセスされる可能性があるため、データはキャッシュにロードされます。さまざまなキーのキャッシュ ロードを手動でトリガーし、さまざまな有効期限を設定して、キャッシュの無効化時間のバランスをとり、同時に大量のアクセスが発生するのを防ぎます。
以上がRedis のキャッシュペネトレーションとキャッシュアバランシェの概念とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。