快取穿透
快取穿透是指查詢一個一定不存在的數據,由於快取不命中,接著查詢資料庫也無法查詢出結果,因此也不會寫入到快取中,這將會導致每個查詢都會去請求資料庫,造成快取穿透; (建議學習:Redis視訊教學#)
解決方案
布隆過濾
對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丟棄,從而避免了對底層存儲系統的查詢壓力;
#緩存空對象
當存儲層不命中後,即使傳回的空物件也將其快取起來,同時會設定過期時間,之後再存取這個資料將會從快取中獲取,保護了後端資料來源;
但是這種方法會存在兩個問題:
如果空值能夠被快取起來,這就意味著快取需要更多的空間儲存更多的鍵,因為這當中可能會有很多的空值的鍵;
即使對空值設定了過期時間,還是會存在快取層和儲存層的資料會有一段時間視窗的不一致,這對於需要保持一致性的業務會有影響。
快取雪崩
快取雪崩是指,由於快取層承載大量請求,有效的保護了儲存層,但是如果快取層由於某些原因整體不能提供服務,於是所有的請求都會達到儲存層,儲存層的呼叫量會暴增,造成儲存層也會掛掉的情況。
解決方案
#保證快取層服務高可用性
即使個別節點、個別機器、甚至是機房宕掉,依然可以提供服務,例如Redis Sentinel 和Redis Cluster 都實現了高可用。
依賴隔離元件為後端限流並降級
#在快取失效後,透過加鎖或佇列來控制讀取資料庫寫入快取的執行緒數。例如對某個key只允許一個線程查詢資料和寫入緩存,其他線程等待。
資料預熱
可以透過快取reload機制,預先去更新緩存,再即將發生大並發存取前手動觸發載入快取不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。
更多Redis相關技術文章,請造訪Redis入門教學欄位學習!
以上是redis雪崩與穿透如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!