キャッシュダウンは、あるキャッシュが失効したとき、瞬時に合併または要求量が大きく、キャッシュが失効したため、直接にデータベースクエリに浸透する。解決方法:シングルマシンの場合は、synchronizedを使用してもいいです。分散式の場合は、redis分布式のロックを設定します。(元のものはsetnx対応redissonです。)ロックを使う時に、タイムアウト時間を加えたほうがいいです。reentrantractlockのタイミングロックtryLock(long,TimeUnit)またはredisのタイムアウト時間String get(String key) {
String value = redis.get(key);
if (value == null) {
if (redis.setnx(key_mutex, "1")) {
// 3 min timeout to avoid mutex holder crash
redis.expire(key_mutex, 3 * 60)
value = db.get(key);
redis.set(key, value);
redis.delete(key_mutex);
} else {
// 50
Thread.sleep(50);
get(key);
}
}
}
キャッシュが突き抜ける頻繁に存在しない値を調べ、故意の攻撃データベース。
解決方法:クエリの結果が空の場合は、まだこの空の結果をキャッシュしていますが、有効期限が短くなります。最長5分以内で、データを更新するときはキャッシュを更新します。方法2:布隆フィルタを使用して、十分大きいビットマップに全ての可能性のあるデータをハッシュすると、必ず存在しないデータがこのbitmapによってブロックされ、それによって下のストレージシステムに対するクエリ圧力が回避される。フィルタを採用する方法は、まず値の範囲を知ることで、bitmapをターゲットに設定できると思います。キャッシュ雪崩以上のキャッシュオブジェクトは、設定された有効期限が一致しています。同じ時間で期限が切れて、データベースを大量に検索します。解決方法:ランダム値を使用して、キャッシュ時間を設定します。例えば、50分から60分の間の乱数。