キャッシュダウン、キャッシュクリア、キャッシュ雪崩


  • キャッシュダウン
  • は、あるキャッシュが失効したとき、瞬時に合併または要求量が大きく、キャッシュが失効したため、直接にデータベースクエリに浸透する。
  • 解決方法:シングルマシンの場合は、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分の間の乱数