一:快取穿透:查詢乙個 必然不存在的資料,首先通過key到快取去查詢,不存在,然後到達db,這樣會對後台的db造成很大的壓力,這樣每次都會請求到達資料庫,這就是快取穿透
快取失效:如果快取集中在一段時間內失效,db的壓力凸顯
快取穿透避免的方法:
1:最簡單粗暴的方法:如果在資料庫中查詢的也為null,直接在快取中設定預設值,設定較短的額過期時間,這樣第二次到快取中屈查詢的時候就會查到;
2:根據快取資料key的規則,在做快取規劃的時候,key有一定規則的話,可以採取這種辦法。這種辦法只能緩解一部分的壓力,過濾和系統無關的查詢,但是無法**。
3:採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitset中,不存在的資料將會被攔截掉,從而避免了對底層儲存系統的查詢壓力。
大併發的快取穿透會導致快取雪崩
二:快取雪崩的情況:當快取伺服器重啟或者大量快取集中在某乙個時間段失效,這樣在失效的時候,也會給後端系統(比如db)帶來很大壓力。
以下原因都會造成快取集體失效,從而引發系統抖動,甚至雪崩:
1:系統預熱資料的快取過期時間過於整齊劃一
2:快取系統宕機或重啟
3:訪問高峰期間產生啦大量的快取,過期時間非常接近
解決思路:
1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。
2,分析使用者行為,盡量讓失效時間點均勻分布。避免快取雪崩的出現。
3,如果是因為某台快取伺服器宕機,可以考慮做主備,比如:redis主備,但是雙快取涉及到更新事務的問題,update可能讀到髒資料,需要好好解決。
分布式快取系統
分布式快取系統面臨的問題
快取一致性問題
1:快取系統與底層資料的一致性。這點在底層系統是「可讀可寫」時,寫得尤為重要
2:有繼承關係的快取之間的一致性。為了盡量提高快取命中率,快取也是分層:全域性快取,二級快取。他們是存在繼承關係的。全域性快取可以有二級快取來組成。
3:多個快取副本之間的一致性。為了保證系統的高可用性,快取系統背後往往會接兩套儲存系統(如memcache,redis等)
快取雪崩和快取穿透
快取雪崩可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分...
快取穿透和快取雪崩
也可以叫redis穿透和redis雪崩。redis是支援key value等多種資料結構的儲存系統,常用於快取。使用者進行查詢,發現redis記憶體資料庫中沒有資料,也就是快取沒有命中,就回去持久化層資料庫中進行查詢,發現也沒有,此次查詢失敗。當使用者過多,快取都沒有命中,每個都去持久化層資料庫中查...
快取穿透和快取雪崩
快取穿透 一般的快取系統的查詢方式都是以key去查詢value,一些不存在對應的value就會去後台系統當中去尋找,一些惡意的請求對資料庫造成巨大的壓力就稱之為快取穿透。快取雪崩 當快取伺服器存在的大量的資料在集中一段時間內失效,這樣失效時會造成後台系統巨大的壓力稱之為快取雪崩。快取擊穿 是指乙個k...