什麼是redis的雪崩和穿透(擊穿)
1.什麼是快取穿透
一般的快取系統,都是按照key值去快取查詢,如果不存在對應的value,就應該去DB中查詢 。這個時候,如果請求的併發量很大,就會對後端的DB系統造成很大的壓力。這就叫做快取穿透。關鍵詞:快取value為空;併發量很大去訪問DB。
造成的原因
1.業務自身程式碼或資料出現問題;2.一些惡意攻擊、爬蟲造成大量空的命中,此時會對資料庫造成很大壓力。
解決方法
1.設定布隆過濾器,將所有可能存在的資料雜湊到一個足夠大的bitmap中,一個一定不存在的資料會被這個bitmap攔截掉,
從避免了對底層儲存系統的查詢壓力。
2. 如果一個查詢返回的資料為空,不管是資料不存在還是系統故障,我們仍然把這個結果進行快取,但是它的過期時間會很短
最長不超過5分鐘。
二、雪崩
1.什麼是雪崩
因為快取層承載了大量的請求,有效的保護了儲存 層,但是如果快取由於某些原因,整體不能夠提供服務,於是所有的請求,就會到達儲存層,儲存層的呼叫量就會暴增,造成儲存層也會掛掉的情況。快取雪崩的英文解釋是奔逃的野牛,指的是快取層當掉之後,併發流量會像奔騰的野牛一樣,大量後端儲存。
存在這種問題的一個場景是:當快取伺服器重啟或者大量快取集中在某一個時間段失效,這樣在失效的時候,大量資料會去直接訪問DB,此時給DB很大的壓力。
2.解決方法
(1)設定redis叢集和DB叢集的高可用,如果redis出現宕機情況,可以立即由別的機器頂替上來。這樣可以防止一部分的風險。
(2)使用互斥鎖
在快取失效後,通過加鎖或者佇列來控制讀和寫資料庫的執行緒數量。比如:對某個key只允許一個執行緒查詢資料和寫快取,其他執行緒等待。單機的話,可以使用synchronized或者lock來解決,如果是分散式環境,可以是用redis的setnx命令來解決。
(3)不同的key,可以設定不同的過期時間,讓快取失效的時間點不一致,儘量達到平均分佈。
(4)永遠不過期
redis中設定永久不過期,這樣就保證了,不會出現熱點問題,也就是物理上不過期。
(5)資源保護
使用netflix的hystrix,可以做各種資源的執行緒池隔離,從而保護主執行緒池。