解決策は次のとおりです: 1. キャッシュの侵入、空のデータをキャッシュしてブルーム フィルターを使用することもできます; 2. キャッシュ アバランチ、対応するホットスポット キーを無期限に設定し、複数のキャッシュを組み合わせて、3 番目のキャッシュを購入できます。パーティー Redis と有効期限をずらすと、有効期限をランダムに生成できます。
このチュートリアルの動作環境: Windows 7 システム、Redis バージョン 5.0.10、DELL G3 コンピューター。
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. Bloom 配列にキーが存在しない場合の誤判定率は 1% ですが、この誤判定率により、一定以下になります配列が長いほど誤検知率は低くなり、配列が短いほど誤検知率は高くなります。キーの値、それはデータベースと Redis の内容が削除されますが、配列内の特定の位置にキーが存在するため、Bloom 配列では削除できません。削除したい場合は、変更します。 1 から 0 ですが、その中のすべてのキーが変更されます。すべての値が削除されます。
3. 追加のコレクションを維持する必要があるため、コードの複雑さも増加します。Redis クラスターを使用する場合、Bloomフィルターは redis と組み合わせて使用する必要があります
2. Redis キャッシュ雪崩
1. キャッシュ雪崩: キャッシュ内のデータは大きなバッチで失敗し、この使用には大量のリクエストを受信する必要がありますが、redis 内のすべてのキーが失敗すると、すべてのリクエストがデータベースに送信され、ダウンタイムが発生します
2。
対応するホットスポット キーを無期限に設定します
有効期限がずらされ、有効期限がランダムに生成され、ホットスポット データの有効期限が長く設定されます。
以上がRedis の雪崩と侵入に対する解決策は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。