快取雪崩可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。
解決思路:
1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。
2,分析使用者行為,盡量讓失效時間點均勻分布。避免快取雪崩的出現。
3,如果是因為某台快取伺服器宕機,可以考慮做主備,比如:redis主備,但是雙快取涉及到更新事務的問題,update可能讀到髒資料,需要好好解決。
快取穿透是指使用者查詢資料,在資料庫沒有,自然在快取中也不會有。這樣就導致使用者查詢的時候,在快取中找不到,每次都要去資料庫中查詢。
解決思路:
1,如果查詢資料庫也為空,直接設定乙個預設值存放到快取,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問資料庫,這種辦法最簡單粗暴。
2,根據快取資料key的規則。例如我們公司是做機頂盒的,快取資料以mac為key,mac是有規則,如果不符合規則就過濾掉,這樣可以過濾一部分查詢。在做快取規劃的時候,key有一定規則的話,可以採取這種辦法。這種辦法只能緩解一部分的壓力,過濾和系統無關的查詢,但是無法**。
3,採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitset中,不存在的資料將會被攔截掉,從而避免了對底層儲存系統的查詢壓力。關於布隆過濾器,詳情檢視:基於bitset的布隆過濾器(bloom filter)
大併發的快取穿透會導致快取雪崩。
快取穿透與快取雪崩
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。1 對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料...
快取穿透與快取雪崩
引用原文 快取系統不得不考慮的另乙個問題是快取穿透與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有 很多種方法可以有效地解決快取穿透問題,...
快取穿透與快取雪崩
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。1 對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料...