緩存穿透:訪問一個不存在的key,導致直接訪問DB,數(shù)據(jù)量很大時導致,數(shù)據(jù)庫掛掉
解決方案
1、緩存空置,設置較短的過期時間,直接返回給請求端
2、采用布隆過濾器,使用一個足夠大的bitmap,用于存儲可能訪問的key,不存在的key直接被過濾;
3、攔截器,id<=0的直接攔截
4、利用互斥鎖,緩存失效的時候,先去獲得鎖,得到鎖了,再去請求數(shù)據(jù)庫。沒得到鎖,則休眠一段時間重試
5、采用異步更新策略,無論key是否取到值,都直接返回。value值中維護一個緩存失效時間,緩存如果過期,異步起一個線程去讀數(shù)據(jù)庫,更新緩存。需要做緩存預熱(項目啟動前,先加載緩存)操作。
緩存擊穿:訪問一個存在的key,在緩存過期的一刻,同時有大量的請求,這些請求都會擊穿到DB,造成瞬時DB請求量大、壓力驟增。
解決方案
(1)設置熱點數(shù)據(jù)永遠不過期。
(2)加互斥鎖。
緩存雪崩:同一時間有大量請求,緩存中沒有數(shù)據(jù),導致直接存數(shù)據(jù)庫中讀取,大量請求導致拖垮數(shù)據(jù)庫