1. 程式人生 > >【redis】redis的雪崩和穿透

【redis】redis的雪崩和穿透

sync 互斥鎖 關鍵詞 緩存系統 代碼 並發 超過 val 能夠

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,可以做各種資源的線程池隔離,從而保護主線程池。

3.使用

四種方案,沒有最佳只有最合適, 根據自己項目情況使用不同的解決策略。

【redis】redis的雪崩和穿透