快取穿透、快取併發和快取雪崩是常見的由於併發量大而導致的快取問題。
快取穿透通常是由惡意攻擊或者無意造成的;快取併發是由於設計不足;快取雪崩是快取同時失效造成的。
快取穿透
快取穿透是使用了不存在的key進行大量的高併發查詢,導致快取無法命中,每次快取穿透後都要去資料庫中進行查詢,導致資料庫壓力過大甚至資料庫服務被壓死。
解決方案
1,將空值也快取,再次接收到同樣的請求,若命中快取並且值為空,就會直接返回,不會穿透到資料庫,避免快取穿透
2,使用布隆過濾器,使用乙個足夠大的bitmap,用於儲存可能訪問的key,不存在的key直接被過濾;
快取併發
快取併發的問題通常發生在高併發場景下,當乙個快取的key過期時,而訪問這個key的請求量比較大,多個請求同時發現快取過期,因此多個請求會同時訪問資料庫來查詢最新資料並寫回快取。造成應用和資料庫的負載增加。
解決方案
分布式鎖:使用分布式鎖,保證每個key同時只有乙個執行緒去查詢,其它執行緒等待。
快取雪崩
快取雪崩是大量的key設定了相同的過期時間,導致快取集中在某乙個時間段內失效,給後端資料庫造成瞬時的負載公升高的壓力。
解決方案
對不同的資料採用不同的失效時間。甚至對相同的資料,不同的請求使用不同的失效時間。可以定義乙個基礎時間10秒,然後加上乙個兩秒以內的隨機數,過期時間為10~12秒,就會避免快取雪崩。
快取穿透 快取併發和快取雪崩筆記
快取穿透 快取併發和快取雪崩是常見的由於併發量大而導致的快取問題。這裡記錄下其產生原因和解決方案。快取穿透是由惡意攻擊或無意造成的 快取併發是由設計不足造成的 快取雪崩是由快取同時失效造成的。概念 快取穿透指的是使用不存在的 key 進行大量的高併發查詢,這導致快取無法命中,每次請求都要穿透到後端資...
快取雪崩和快取穿透
快取雪崩可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分...
快取穿透和快取雪崩
一 快取穿透 查詢乙個 必然不存在的資料,首先通過key到快取去查詢,不存在,然後到達db,這樣會對後台的db造成很大的壓力,這樣每次都會請求到達資料庫,這就是快取穿透 快取失效 如果快取集中在一段時間內失效,db的壓力凸顯 快取穿透避免的方法 1 最簡單粗暴的方法 如果在資料庫中查詢的也為null...