緩存穿透是指查詢一個必定不存在的數據,因爲緩存不命中,接着查詢數據庫也沒法查詢出結果,所以也不會寫入到緩存中,這將會致使每一個查詢都會去請求數據庫,形成緩存穿透;後端
對全部可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丟棄,從而避免了對底層存儲系統的查詢壓力;緩存
當存儲層不命中後,即便返回的空對象也將其緩存起來,同時會設置一個過時時間,以後再訪問這個數據將會從緩存中獲取,保護了後端數據源;併發
可是這種方法會存在兩個問題:分佈式
若是空值可以被緩存起來,這就意味着緩存須要更多的空間存儲更多的鍵,由於這當中可能會有不少的空值的鍵;高併發
即便對空值設置了過時時間,仍是會存在緩存層和存儲層的數據會有一段時間窗口的不一致,這對於須要保持一致性的業務會有影響。spa
緩存雪崩是指,因爲緩存層承載着大量請求,有效的保護了存儲層,可是若是緩存層因爲某些緣由總體不能提供服務,因而全部的請求都會達到存儲層,存儲層的調用量會暴增,形成存儲層也會掛掉的狀況。線程
即便個別節點、個別機器、甚至是機房宕掉,依然能夠提供服務,好比 Redis Sentinel 和 Redis Cluster 都實現了高可用。 orm
在緩存失效後,經過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。好比對某個key只容許一個線程查詢數據和寫緩存,其餘線程等待。對象
能夠經過緩存reload機制,預先去更新緩存,再即將發生大併發訪問前手動觸發加載緩存不一樣的key,設置不一樣的過時時間,讓緩存失效的時間點儘可能均勻。
緩存併發是指,高併發場景下同時大量查詢過時的key值、最後查詢數據庫將緩存結果回寫到緩存、形成數據庫壓力過大
在緩存更新或者過時的狀況下,先獲取鎖,在進行更新或者從數據庫中獲取數據後,再釋放鎖,須要必定的時間等待,就能夠從緩存中繼續獲取數據。