Redis 面試熱點:什麼是 Redis 的雪崩、穿透和擊穿?(附筆記)

Redis 面試熱點:什麼是 Redis 的雪崩、穿透和擊穿?(附筆記)

面試題

瞭解什麼是 redis 的雪崩、穿透和擊穿?redis 崩潰之後會怎麼樣?系統該如何應對這種情況?如何處理 redis 的穿透?

面試官心理分析

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

面試題剖析

緩存雪崩

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

這就是緩存雪崩。

Redis 面試熱點:什麼是 Redis 的雪崩、穿透和擊穿?(附筆記)

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

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

  • 事前:redis 高可用,主從+哨兵,redis cluster,避免全盤崩潰。
  • 事中:本地 ehcache 緩存 + hystrix 限流&降級,避免 MySQL 被打死。
  • 事後:redis 持久化,一旦重啟,自動從磁盤上加載數據,快速恢復緩存數據。
Redis 面試熱點:什麼是 Redis 的雪崩、穿透和擊穿?(附筆記)

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

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

好處:

  • 數據庫絕對不會死,限流組件確保了每秒只有多少個請求能通過。
  • 只要數據庫不死,就是說,對用戶來說,2/5 的請求都是可以被處理的。
  • 只要有 2/5 的請求可以被處理,就意味著你的系統沒死,對用戶來說,可能就是點擊幾次刷不出來頁面,但是多點幾次,就可以刷出來一次。

緩存穿透

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

黑客發出的那 4000 個攻擊,緩存中查不到,每次你去數據庫裡查,也查不到。

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

Redis 面試熱點:什麼是 Redis 的雪崩、穿透和擊穿?(附筆記)

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

緩存擊穿

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

不同場景下的解決方式可如下:

  • 若緩存的數據是基本不會發生更新的,則可嘗試將該熱點數據設置為永不過期。
  • 若緩存的數據更新不頻繁,且緩存刷新的整個流程耗時較少的情況下,則可以採用基於 redis、zookeeper 等分佈式中間件的分佈式互斥鎖,或者本地互斥鎖以保證僅少量的請求能請求數據庫並重新構建緩存,其餘線程則在鎖釋放後能訪問到新緩存。
  • 若緩存的數據更新頻繁或者緩存刷新的流程耗時較長的情況下,可以利用定時線程在緩存過期前主動的重新構建緩存或者延後緩存的過期時間,以保證所有的請求能一直訪問到對應的緩存。

好了,上面就是常見的3種適用Redis統計網站用戶訪問數的方法了。今天的介紹我們就講到這裡,關於readis,我也總結了我平時學習的時候也做了很多學習筆記,而且做了很多的學習思維導圖 xmind,分享給大家,大家有需要的也可以關注小編+轉發文章+私信:【架構資料】獲取

分佈式數據緩存(readis):

Redis 面試熱點:什麼是 Redis 的雪崩、穿透和擊穿?(附筆記)

關係型數據庫瓶頸與優化。

2,非關係型數據庫數據中間件mongoDb,redis,tair,memcache,neo4j對比。

3,分佈式數據緩存之readis:

  • 行業使用redis場景詳解與演變過程
  • 解密redis基本數據類型,哨兵機制,複製,常用命令
  • 快速開始redis,Cluster集群和原理
  • 深入詳解集群分配算法詳解與動態水平擴容與監控
  • 深入詳解jedis cluster開發與通訊協議詳解
  • 實戰企業級項目resdis框架gcache架構與開發

相關核心知識點:

基於 Redis 分佈式鎖

  1. 獲取鎖的時候,使用 setnx(SETNX key val:當且僅當 key 不存在時,set一個 key為 val 的字符串,返回 1;若 key 存在,則什麼都不做,返回 0)加鎖,鎖的 value值為一個隨機生成的 UUID,在釋放鎖的時候進行判斷。並使用 expire 命令為鎖添加一個超時時間,超過該時間則自動釋放鎖。
  2. 獲取鎖的時候調用 setnx,如果返回 0,則該鎖正在被別人使用,返回 1 則成功獲取鎖。 還設置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。
  3. 釋放鎖的時候,通過 UUID 判斷是不是該鎖,若是該鎖,則執行 delete 進行鎖釋放。
Redis 面試熱點:什麼是 Redis 的雪崩、穿透和擊穿?(附筆記)

最後:

除了上面的Redis 相關核心知識點外,同時還分享更多精選整理的學習資料,包含(Dubbo、Redis、Netty、zookeeper、Spring cloud、分佈式、高併發等架構資料和完整的Java架構學習進階導圖!)

資料免費領取方式:轉發+轉發+轉發關注後,私信關鍵詞【資料】即可獲取免費領取方式!

重要的事說三遍,轉發+轉發+轉發!


分享到:


相關文章: