一、緩存穿透
當(dāng)查詢時针炉,key是一個不存在的數(shù)據(jù)挠他,即不會命中緩存層,也不會命中數(shù)據(jù)庫層篡帕,如果殖侵,同時大量出現(xiàn)不存在的key則會試數(shù)據(jù)庫壓力劇增;一般這種場景在業(yè)務(wù)代碼或數(shù)據(jù)出現(xiàn)問題時镰烧,或者存在惡意攻擊拢军、爬蟲等造成的空命中;
解決方案:
1.緩存空對象
如果當(dāng)某個key值命中數(shù)據(jù)庫時怔鳖,不存在,則緩存 null 到當(dāng)前key中,后續(xù)寫入該key時度陆,覆蓋null值艾凯;
但該方案只能防止正常業(yè)務(wù)查詢出現(xiàn)的數(shù)據(jù)問題,當(dāng)存在惡意攻擊時懂傀,大量的空命中趾诗,還是解決不了
2.布隆過濾器
布隆過濾器功能:當(dāng)某個值經(jīng)過布隆過濾器時,不存在蹬蚁,則該值肯定不存在恃泪;當(dāng)布隆過濾器結(jié)果為存在時,該值可能存在
主要原理犀斋,布隆過濾器是一個二進(jìn)制數(shù)組贝乎,用0來代表不存在,1來代表存在闪水;然后對當(dāng)前值進(jìn)行Hash散列糕非,最后取模,和HashMap取模方式有點相似球榆,再把命中的數(shù)組位置朽肥,修改為1;
使用布隆過濾器的方案持钉,在程序啟動時衡招,把所有key放入布隆過濾器,后續(xù)當(dāng)獲取key時每强,如果布隆過濾器結(jié)果為不存在始腾,則直接返回;
二空执、緩存失效
當(dāng)保存某一批熱點key時浪箭,設(shè)置了相同的過期時間,當(dāng)這一批熱點key失效時辨绊,大量請求都會命中數(shù)據(jù)庫
解決方案:
設(shè)置失效時間奶栖,使用 固定時間 + 隨機時間 來避免熱點數(shù)據(jù),同時失效
三门坷、緩存雪崩問題
當(dāng)緩存層宕機后宣鄙,所有查詢都打向后端數(shù)據(jù)庫,導(dǎo)致服務(wù)器壓力過大
解決方案:
1.保證緩存層的高可用默蚌,使用哨兵或集群等提高服務(wù)的可用性
但是不管是哨兵還是集群冻晤,都會存在宕機時,短暫的不可用绸吸,導(dǎo)致查詢打向后端數(shù)據(jù)庫
2.服務(wù)降級鼻弧,熔斷
可以針對非核心業(yè)務(wù)進(jìn)行降級设江,或者熔斷