1. 程式人生 > >阿裏Java面試題剖析:了解什麽是 redis 的雪崩和穿透?redis 崩潰之後會怎麽樣?

阿裏Java面試題剖析:了解什麽是 redis 的雪崩和穿透?redis 崩潰之後會怎麽樣?

amp 可能 沒有 國內 shadow 互聯網 限流 http 用戶

面試原題

了解什麽是 redis 的雪崩和穿透?redis 崩潰之後會怎麽樣?系統該如何應對這種情況?如何處理 redis 的穿透?
面試官心理分析

其實這是問到緩存必問的,因為緩存雪崩和穿透,是緩存最大的兩個問題,要麽不出現,一旦出現就是致命性的問題,所以面試官一定會問你。

面試題剖析

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

這就是緩存雪崩。
技術分享圖片

大約在 3 年前,國內比較知名的一個互聯網公司,曾因為緩存事故,導致雪崩,後臺系統全部崩潰,事故從當天下午持續到晚上淩晨 3~4 點,公司損失了幾千萬。

緩存雪崩的事前事中事後的解決方案如下。

事前:redis 高可用,主從+哨兵,redis cluster,避免全盤崩潰。

事中:本地 ehcache 緩存 + hystrix 限流&降級,避免 MySQL 被打死。

事後:redis 持久化,一旦重啟,自動從磁盤上加載數據,快速恢復緩存數據。

技術分享圖片
用戶發送一個請求,系統 A 收到請求後,先查本地 ehcache 緩存,如果沒查到再查 redis。如果 ehcache 和 redis 都沒有,再查數據庫,將數據庫中的結果,寫入 ehcache 和 redis 中。

限流組件,可以設置每秒的請求,有多少能通過組件,剩余的未通過的請求,怎麽辦?走降級!可以返回一些默認的值,或者友情提示,或者空白的值。

好處

數據庫絕對不會死,限流組件確保了每秒只有多少個請求能通過。

只要數據庫不死,就是說,對用戶來說,2/5 的請求都是可以被處理的。

只要有 2/5 的請求可以被處理,就意味著你的系統沒死,對用戶來說,可能就是點擊幾次刷不出來頁面,但是多點幾次,就可以刷出來一次。

緩存穿透
對於系統A,假設一秒 5000 個請求,結果其中 4000 個請求是***發出的惡意***。

***發出的那 4000 個***,緩存中查不到,每次你去數據庫裏查,也查不到。

舉個栗子。數據庫 id 是從 1 開始的,結果***發過來的請求 id 全部都是負數。這樣的話,緩存中不會有,請求每次都“視緩存於無物”,直接查詢數據庫。這種惡意***場景的緩存穿透就會直接把數據庫給打死。

技術分享圖片

解決方式很簡單,每次系統 A 從數據庫中只要沒查到,就寫一個空值到緩存裏去,比如 set -999 UNKNOWN。這樣的話,下次便能走緩存了。

阿裏Java面試題剖析:了解什麽是 redis 的雪崩和穿透?redis 崩潰之後會怎麽樣?