快取穿透的概念很簡單,使用者想要查詢乙個資料,發現redis記憶體資料沒有,也就是快取沒有命中,於是向資料庫查詢,發現也沒有,於是本次查詢失敗,當使用者很多的時候,快取都沒有命中(例如秒殺),於是都去請求資料庫,這會給資料庫造成很大的壓力,這就相當於快取穿透
布隆過濾器
布隆過濾器是一種資料結構,對所有可能查詢的引數以hash形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免了對底層儲存系統的查詢壓力
當儲存層不命中後,即使返回的空物件,也將其快取起來,同時會設定乙個過期時間,之後再訪問這個資料會從快取中獲取,保護了後端資料來源;
但是這種方法會存在兩個問題:
如果空值能夠被快取起來,這就意味著快取需要更多的空間儲存更多的鍵,因為這當中可能會有很多空值的鍵
即使對空值設定了過期時間,還是會存在快取層和儲存層的資料會有一段時間視窗的不一致,這對於需要保持一致性的業務會有影響
快取擊穿,是指乙個key非常熱點,在不停的扛著大併發,大併發集中對這乙個點進行訪問,當這個key在失效的瞬間,持續的大併發會擊穿快取,直接請求資料庫,就像在乙個牆上鑿開了乙個洞。
當某個key在過期的瞬間,有大量的請求併發訪問,這類資料一般是熱點資料,由於快取過期,會同時訪問資料庫來查詢最新資料,並且回寫快取,會導致資料庫瞬間壓力過大。
設定熱點資料永不過期
加互斥鎖(setnx)
快取雪崩,是指在某乙個時間段,快取集中過期失效,redis宕機!產生雪崩的原因之一,比如雙12零點的搶購,這波商品時間比較集中的放入了快取,假設快取乙個小時,那麼到了凌晨一點鐘的時候,這批商品的快取就都過期了,而對這批商品的訪問查詢,都落到了資料庫上,對於資料庫而言,就會產生週期性的壓力波峰。於是所有的請求都會到達儲存層,儲存層的呼叫量會暴增,造成儲存層掛掉的情況。
其實集中過期,倒不是非常致命,比較致命的快取雪崩,是快取伺服器某個節點宕機或斷網。因為自然形成的快取雪崩,一定是在某個時間段集中建立快取,這個時候,資料庫也是可以頂住壓力的,無非就是對資料庫產生週期性的壓力而已,而快取伺服器的宕機,對資料庫伺服器造成的壓力是不可預知的,很有可能瞬間就把資料庫壓垮。
redis高可用
限流降級
資料預熱
快取穿透與快取雪崩
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。1 對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料...
快取穿透與快取雪崩
引用原文 快取系統不得不考慮的另乙個問題是快取穿透與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有 很多種方法可以有效地解決快取穿透問題,...
快取穿透與快取雪崩
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。1 對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料...