redis快取雪崩 穿透 擊穿概念及解決辦法

2022-08-09 19:15:17 字數 2123 閱讀 5967

對於系統 a,假設每天高峰期每秒 5000 個請求,本來快取在高峰期可以扛住每秒 4000 個請求,但是快取機器意外發生了全盤宕機。快取掛了,此時 1 秒 5000 個請求全部落資料庫,資料庫必然扛不住,它會報一下警,然後就掛了。此時,如果沒有採用什麼特別的方案來處理這個故障,dba 很著急,重啟資料庫,但是資料庫立馬又被新的流量給打死了。

這就是快取雪崩。

大約在 3 年前,國內比較知名的乙個網際網路公司,曾因為快取事故,導致雪崩,後台系統全部崩潰,事故從當天下午持續到晚上凌晨 3~4 點,公司損失了幾千萬。

快取雪崩的事前事中事後的解決方案如下。

使用者傳送乙個請求,系統 a 收到請求後,先查本地 ehcache 快取,如果沒查到再查 redis。如果 ehcache 和 redis 都沒有,再查資料庫,將資料庫中的結果,寫入 ehcache 和 redis 中。

限流元件,可以設定每秒的請求,有多少能通過元件,剩餘的未通過的請求,怎麼辦?走降級!可以返回一些預設的值,或者友情提示,或者空白的值。

好處:對於系統a,假設一秒 5000 個請求,結果其中 4000 個請求是黑客發出的惡意攻擊。

黑客發出的那 4000 個攻擊,快取中查不到,每次你去資料庫里查,也查不到。

舉個栗子。資料庫 id 是從 1 開始的,結果黑客發過來的請求 id 全部都是負數。這樣的話,快取中不會有,請求每次都「視快取於無物」,直接查詢資料庫。這種惡意攻擊場景的快取穿透就會直接把資料庫給打死。

解決方式很簡單,每次系統 a 從資料庫中只要沒查到,就寫乙個空值到快取裡去,比如set -999 unknown。然後設定乙個過期時間,這樣的話,下次有相同的 key 來訪問的時候,在快取失效之前,都可以直接從快取中取資料。

快取擊穿,就是說某個 key 非常熱點,訪問非常頻繁,處於集中式高併發訪問的情況,當這個 key 在失效的瞬間,大量的請求就擊穿了快取,直接請求資料庫,就像是在一道屏障上鑿開了乙個洞。

解決方式也很簡單,可以將熱點資料設定為永遠不過期;或者基於 redis or zookeeper 實現互斥鎖,等待第乙個請求構建完快取之後,再釋放鎖,進而其它請求才能通過該 key 訪問資料。

對於系統 a,假設每天高峰期每秒 5000 個請求,本來快取在高峰期可以扛住每秒 4000 個請求,但是快取機器意外發生了全盤宕機。快取掛了,此時 1 秒 5000 個請求全部落資料庫,資料庫必然扛不住,它會報一下警,然後就掛了。此時,如果沒有採用什麼特別的方案來處理這個故障,dba 很著急,重啟資料庫,但是資料庫立馬又被新的流量給打死了。

這就是快取雪崩。

大約在 3 年前,國內比較知名的乙個網際網路公司,曾因為快取事故,導致雪崩,後台系統全部崩潰,事故從當天下午持續到晚上凌晨 3~4 點,公司損失了幾千萬。

快取雪崩的事前事中事後的解決方案如下。

使用者傳送乙個請求,系統 a 收到請求後,先查本地 ehcache 快取,如果沒查到再查 redis。如果 ehcache 和 redis 都沒有,再查資料庫,將資料庫中的結果,寫入 ehcache 和 redis 中。

限流元件,可以設定每秒的請求,有多少能通過元件,剩餘的未通過的請求,怎麼辦?走降級!可以返回一些預設的值,或者友情提示,或者空白的值。

好處:對於系統a,假設一秒 5000 個請求,結果其中 4000 個請求是黑客發出的惡意攻擊。

黑客發出的那 4000 個攻擊,快取中查不到,每次你去資料庫里查,也查不到。

舉個栗子。資料庫 id 是從 1 開始的,結果黑客發過來的請求 id 全部都是負數。這樣的話,快取中不會有,請求每次都「視快取於無物」,直接查詢資料庫。這種惡意攻擊場景的快取穿透就會直接把資料庫給打死。

解決方式很簡單,每次系統 a 從資料庫中只要沒查到,就寫乙個空值到快取裡去,比如set -999 unknown。然後設定乙個過期時間,這樣的話,下次有相同的 key 來訪問的時候,在快取失效之前,都可以直接從快取中取資料。

快取擊穿,就是說某個 key 非常熱點,訪問非常頻繁,處於集中式高併發訪問的情況,當這個 key 在失效的瞬間,大量的請求就擊穿了快取,直接請求資料庫,就像是在一道屏障上鑿開了乙個洞。

解決方式也很簡單,可以將熱點資料設定為永遠不過期;或者基於 redis or zookeeper 實現互斥鎖,等待第乙個請求構建完快取之後,再釋放鎖,進而其它請求才能通過該 key 訪問資料。

Redis快取穿透,穿透擊穿,快取雪崩

乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...

redis 快取穿透 擊穿 雪崩

介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key value對寫為key null,快取有效時間可以設定短點,如30秒 設定太長會導致正常情況也沒法使用 這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊 public o...

redis快取穿透,擊穿,雪崩

快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,多來自於黑客攻擊。由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,要是有人利用不存在的k...