Redis緩存穿透和雪崩
redis緩存的使用極大的提升了應用程序的性能和效率,特別是數據查詢方面,但同時,它也帶來了一些問題。其中,最要害的問題,就是一些數據的一致性問題,從嚴格意義上講,這個問題不好解決。如果對數據的一致性要求很高,那么不能是用緩存。
另外的問題就是緩存穿透,緩存雪崩和緩存擊穿。
緩存穿透
緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷發起請求,如發起為id為“-1”的數據或id為特別大不存在的數據。這時的用戶很可能是攻擊者,攻擊會導致數據庫壓力過大。
解決方案
1、當數據庫也查不到時,可以在緩存中存一個空對象,但這個存在弊端,可能在緩存中會存在大量的值為空的鍵
2、布隆過濾器:布隆過濾器是一種數據結構,對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合規則的直接丟棄,從而避免了底層存儲系統的查詢壓力。
緩存擊穿
緩存穿透和緩存擊穿的區別:緩存擊穿是指一個key非常熱點,在不停的扛着大並發,大並發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大並發就擊破緩存,直接請求數據庫。導致數據庫的壓力過大,數據庫可能因此宕機。
解決方案
1、設置熱點數據永不過期
2、加互斥鎖:可以利用redis來進行分布式鎖(setnx)來保證同時只有一個線程去查詢后端服務,其他線程沒有獲得分布式鎖的權限,因此只需要等待即可,這種方式將高並發的壓力轉移到了分布式鎖上,因此對分布式鎖的考驗很大。
緩存雪崩
緩存雪崩是指緩存中數據大批量到過期時間,而查詢數據量巨大,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是, 緩存擊穿指並發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
解決方案
1、高並發情況下,可以停掉一些次要的服務,保證熱點的服務扛過當前的高峰期
2、保證緩存服務高可用,設置redis集群
3、避免緩存集中失效,不同的key設置不同的超時時間