Redis緩存穿透和緩存雪崩以及解決方案
緩存穿透
緩存穿透是指查詢一個一定不存在的資料,由于緩存不命中,接着查詢資料庫也無法查詢出結果,是以也不會寫入到緩存中,這将會導緻每個查詢都會去請求資料庫,造成緩存穿透;
解決方案
布隆過濾
對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丢棄,進而避免了對底層存儲系統的查詢壓力;
緩存空對象
當存儲層不命中後,即使傳回的空對象也将其緩存起來,同時會設定一個過期時間,之後再通路這個資料将會從緩存中擷取,保護了後端資料源;
但是這種方法會存在兩個問題:
如果空值能夠被緩存起來,這就意味着緩存需要更多的空間存儲更多的鍵,因為這當中可能會有很多的空值的鍵;
即使對空值設定了過期時間,還是會存在緩存層和存儲層的資料會有一段時間視窗的不一緻,這對于需要保持一緻性的業務會有影響。
比較
緩存雪崩
緩存雪崩是指,由于緩存層承載着大量請求,有效的保護了存儲層,但是如果緩存層由于某些原因整體不能提供服務,于是所有的請求都會達到存儲層,存儲層的調用量會暴增,造成存儲層也會挂掉的情況。
保證緩存層服務高可用性
即使個别節點、個别機器、甚至是機房宕掉,依然可以提供服務,比如 Redis Sentinel 和 Redis Cluster 都實作了高可用。
依賴隔離元件為後端限流并降級
在緩存失效後,通過加鎖或者隊列來控制讀資料庫寫緩存的線程數量。比如對某個key隻允許一個線程查詢資料和寫緩存,其他線程等待。
資料預熱
可以通過緩存reload機制,預先去更新緩存,再即将發生大并發通路前手動觸發加載緩存不同的key,設定不同的過期時間,讓緩存失效的時間點盡量均勻。
緩存并發
緩存并發是指,高并發場景下同時大量查詢過期的key值、最後查詢資料庫将緩存結果回寫到緩存、造成資料庫壓力過大
分布式鎖
在緩存更新或者過期的情況下,先擷取鎖,在進行更新或者從資料庫中擷取資料後,再釋放鎖,需要一定的時間等待,就可以從緩存中繼續擷取資料。
原文位址
https://www.cnblogs.com/George1994/p/10668889.html