Redisのキャッシュペネトレーションとキャッシュアバランシェおよびソリューション

Redisキャッシュの浸透とソリューション

1.キャッシュの浸透

1.ユーザーが照会したキーがredisに存在せず、対応するIDがデータベースに存在しない場合、不正なユーザーが攻撃されると、多数のリクエストがデータベースに直接ヒットし、ダウンタイムが発生して影響を及ぼします。システム全体。この現象はキャッシュペネトレーションと呼ばれます。

2.解決策1:空の文字列、空のオブジェクト、空の配列、リストなどの空のデータをキャッシュします。コードは次のとおりです。

if (list != null && list.size() > 0) {
                redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list));
            } else {
                redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list), 5*60);
            }

3.解決策2:ブルームフィルター

ブルームフィルター:次の図に示すように、要素が配列内にあるかどうかを判断します。バイナリシステムで作成されたストレージは、比較的小さなメモリを使用します。0は存在しないことを意味し、1は存在することを意味し、クエリ効率の追加は非常に高速です。値が保存されるアルゴリズムを実行して、対応する値をブルームフィルターのセットの特定の位置に保存します。特定の位置に複数のキーが存在する場合があります。存在しないキー値が渡されると、次のように照合されます。セット。一致する場合はnullを返します。
短所:1。1%の誤判定率。ブルーム配列にキーが存在しないが、この誤判​​定率のために、キーが存在すると判断されます。特定の状況下で、配列の長さが長いほど誤検出率が低くなり、配列が短いほど誤検出率が高くなります
。2 キー値を削除する場合は、データベースとredisですが、配列の特定の位置にキーのペアがあるため、ブルーム配列を削除できません。削除する場合は、1を0に変更しますが、その中のすべてのキー値削除されます
。我々は、追加のコレクションを維持する必要があるため3.コードの複雑さが増加します。私たちはRedisのクラスタを使用すると、ブルームフィルタは、Redisのと組み合わせて使用する必要があります
ここに画像の説明を挿入します

2、Redisキャッシュアバランシェ

1.キャッシュアバランシェ:キャッシュ内のデータが大量に無効化された後、この使用のために多数のリクエストが送信されますが、redisのキーがすべて無効化されるため、すべてのリクエストがデータベースに送信され、ダウンタイムが発生します

2.解決策

1.対応するホットキーを無期限に設定します
。2。有効期限をずらし、有効期限をランダムに生成し、ホットデータの有効期限を長く設定し、非ホットデータを短く設定できます
3。次のような複数のキャッシュの組み合わせ:エントリのリクエスト、redisが存在しない場合は今すぐredisをリクエストし、存在しない場合はmemcacheをリクエストし、db
4をリクエストできます。サードパーティのRedisの調達(AlibabaCloudまたはTencentCloudでのredis)

おすすめ

転載: blog.csdn.net/qq_43141726/article/details/114499061