キャッシュスルーの問題
1318 ワード
定義#テイギ#は持続層が存在しないデータを要求し、要求するたびにmissをキャッシュし、持続層もmissし、いずれも持続層に打たれ、キャッシュ層が持続層を保護する意義を失った.
キャッシュスルーの理由業務コード自身の問題、SQLが書き間違えて、持続的なレベルが他の人にデータを得られなかったなど; 悪意のある攻撃、爬虫類など;
キャッシュ・スルーの問題の検出方法ビジネス応答時間:すべてのリクエストが永続層に送信され、ビジネス応答時間が遅くなります. 業務自体の問題; 関連指標:総呼び出し数、キャッシュ層ヒット数、ストレージ層ヒット数;
ソリューション(一)キャッシュ空のオブジェクト missをキャッシュしてmissを格納すると、キャッシュに空のオブジェクトをキャッシュして期限切れを設定し、次のリクエストはストレージレイヤにヒットしません.
発生した二つの問題悪意のある攻撃が発生すると、より多くのキーが生成されます.値は空ですが、期限切れを設定することでリスクを低減できます. インタフェースが一時的に使用できないためにスルーされた場合、キャッシュ・レイヤとデータ・レイヤのデータが短期的に一致しないため、MQを介してインタフェースの正常なメッセージを購読し、キャッシュをリフレッシュすることができる.
サンプル擬似コード
ソリューション(二)ブロンフィルタブロックキャッシュレイヤ間にブラウンフィルタを追加し、フィルタリングされたらキャッシュにヒットしません. は固定データを比較するのに適している. ブロンフィルタには小さなメモリが必要です. 例えば10億データ量の電話帳は、ブロンフィルタで予熱することができ、小さなメモリだけで、ブロンフィルタは電話帳にこのキー値があるかどうかを知ることができます.
キャッシュスルーの理由
キャッシュ・スルーの問題の検出方法
ソリューション(一)キャッシュ空のオブジェクト
発生した二つの問題
サンプル擬似コード
public String getPassThrough(String key) {
String cacheValue = cache.get(key);
if(StringUtils.isBlank(cacheValue) {
String storeValue = storage.get(key);
cache.set(key, storeValue);
if(StringUtils.isBlank(storeValue) {
cache.expire(key, 60 * 5);
}
return storageValue;
} else {
return cacheValue;
}
}
ソリューション(二)ブロンフィルタブロック