キャッシュの侵入に対する解決策: 1. 空のデータをキャッシュする; 2. ブルーム フィルターを使用する。 2. キャッシュなだれに対する解決策: 1. 対応するホットスポット キーを期限切れにしないように設定する; 2. 有効期限をずらし、有効期限にランダム生成を使用し、ホットスポット データの有効期限を長く設定する; 3. 複数のキャッシュを結合する; 4. サードパーティ Redis の調達。
このチュートリアルの動作環境: Windows 7 システム、Redis バージョン 6、DELL G3 コンピューター。
1. キャッシュの侵入
ユーザーがクエリしたキーがredis上に存在せず、対応するIDがデータベース内にも存在しない この時、不正ユーザーによる攻撃を受ける 大量のリクエストがDBに直撃し、ダウンタイムを引き起こし、システム全体に影響を与える. この現象はキャッシュペネトレーションと呼ばれます。
解決策 1: 空の文字列、空のオブジェクト、空の配列またはリストなどの空のデータもキャッシュします。コードは次のとおりです。
if (list != null && list.size() > 0) { redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list)); } else { redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list), 5*60); }
解決策2: ブルーム フィルター
ブルーム フィルター:
以下に示すように、バイナリを使用して要素が配列内にあるかどうかを判断します。占有されるメモリは比較的小さく、 0 は存在しないことを表し、1 は存在することを表し、クエリの追加効率は非常に高速です。値が保存されるとき、アルゴリズムが使用され、対応する値がブルーム フィルターのコレクション上の特定の位置に保存されます。複数存在する場合があります。キー。存在しないキー値が渡されると、セットと照合されます。一致しない場合は、null が返されます。
欠点:
1、1 % ブルーム配列にキーが存在しないが、この誤判定率により、ある状況下ではキーが存在すると判断してしまう誤判定率 配列が長いほど誤判定率は低く、配列が短いほど誤判定率は低くなります
#2. あるキー値を削除したい場合、データベースやredisの内容は削除されますが、Bloom配列では削除できません。配列内に特定の位置があるため、キーのペアを削除する場合は 1 を 0 に変更しますが、すべてのキー値が削除されます3。コードの複雑さも影響します。 Redis クラスターを使用する場合は、ブルーム フィルターを redis と組み合わせて使用する必要があります
# 2 . Redis キャッシュ雪崩
キャッシュ雪崩: キャッシュ内のデータが大量のバッチで失敗し、この使用には大量のリクエストが必要になります。ただし、Redis 内のすべてのキーが失敗したためです。 、すべてのリクエストがデータベースに送信され、ダウンタイムが発生します解決策
1. 対応するホットスポット キーを無期限に設定します[関連する推奨事項:2. ずらす有効期限、有効期限はランダムに生成され、ホットスポット データ 有効期限は長く設定でき、非ホット データは短く設定できます。
3. 複数のキャッシュを組み合わせる。たとえば、リクエストが来たとき、今すぐ redis をリクエストし、redis に存在しない場合は memcache をリクエストできます。存在しない場合は、もう一度行ってください。db
をリクエストします。 4. サードパーティの Redis を購入します (Alibaba Cloud または Tencent Cloud 上の redis)
Redis ビデオ チュートリアル ]
以上がRedis キャッシュの雪崩と侵入を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。