什么是redis雪崩、穿透和擊穿?如何解決?


redis的雪崩、穿透和擊穿

一、緩存雪崩
緩存雪崩表示在某一時間段,緩存集中失效,導致請求全部走數據庫,有可能搞垮數據庫,使整個服務癱瘓
使緩存集中失效的原因:
1、雪崩就是指緩存中大批量熱點數據過期后系統涌入大量的查詢請求,因為redis數據已經失效,請求就會滲透到數據庫會導致數據庫造成查詢堵塞甚至宕機
2、redis宕機

 

 


 

解決辦法
1、讓redis數據永不過期,這種方式最可靠的,最安全的但是占空間,內存消耗大,並且不能保持數據最新,所以需要根據具體的業務邏輯來做
2、將緩存失效時間分散開,比如每個key的過期時間都是隨機的,防止同一時間大量數據過期的現象發生,就不會出現同一時間全部請求都落在數據庫。
3、因為redis宕機導致緩存雪崩的問題,可以啟動服務熔斷機制,暫停業務應用對緩存服務的訪問,直接返回錯誤,但是暫停了業務應用訪問緩存系統,全部業務都無法正常的工作
4、創造redis集群,對數據庫進行讀寫分離
二、緩存穿透
緩存穿透是指用戶不斷的發起請求訪問緩存和數據庫中都沒有的數據,比如發起id為-1或id特別大不存在的數據,這時用戶可能就是攻擊者,導致數據庫壓力過大
解決辦法
1、接口層添加校驗,如用戶鑒權校驗;id做基礎校驗,指定接口的請求方式,只接受一種或幾種 的請求方式。
2、對緩存取不到的數據,在數據庫中也沒有取到,這時可以將key-value寫成key-null,緩存有效時間可以設置30秒(設置太長對導致正常情況下也無法使用),這樣可以防止攻擊用戶反復用同一個id暴力攻擊
3、布隆過濾器
三、緩存擊穿
我們的業務通常會有幾個數據會被頻繁的訪問,這類被頻繁的數據稱為熱點數據
如果緩存中的某個熱點數據過期了,此次大量的請求訪問了該熱點數據,無法從緩存中讀取,直接訪問數據庫,數據庫很容易被大量的請求沖垮
解決辦法
1、互斥鎖,保證同一時間只有一個業務線程更新緩存,未能獲取互斥鎖的請求,要么等待鎖釋放后重新讀取緩存,要么就返回空值或者默認值。
2、不給熱點數據設置過期時間,由后台異步更新緩存,或者在熱點數據准備要過期前,提前通知后台線程更新緩存以及重新設置過期時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM