聽說10個人去網際網路公司面試,有9個人會被問到快取雪崩和快取穿透的問題。
聽說,這9個人裡面,至少有8個人回答得不完整。
而這8個人裡面,全都是在網上找的各種面試資料去應付的,並沒有真正理解。
當然,也很正常,只有大規模應用快取的架構才會重點關注這兩個問題。
那麼如何真正理解這兩個問題的底層邏輯,我們來看普通人和高手的回答。
普通人:
嗯.................
高手:
快取雪崩,就是儲存在快取裡面的大量資料,在同一個時刻全部過期,
原本快取元件抗住的大部分流量全部請求到了資料庫。
導致資料庫壓力增加造成資料庫伺服器崩潰的現象。
導致快取雪崩的主要原因,我認為有兩個:
- 快取中介軟體當機,當然可以對快取中介軟體做高可用叢集來避免。
- 快取中大部分key都設定了相同的過期時間,導致同一時刻這些key都過期了。對於這樣的情況,可以在失效時間上增加一個1到5分鐘的隨機值。
快取穿透問題,表示是短時間內有大量的不存在的key請求到應用裡面,而這些不存在的key在快取裡面又找不到,從而全部穿透到了資料庫,造成資料庫壓力。
我認為這個場景的核心問題是針對快取的一種攻擊行為,因為在正常的業務裡面,即便是出現了這樣的情況,由於快取的不斷預熱,影響不會很大。
而攻擊行為就需要具備時間是的持續性,而只有key確實在資料庫裡面也不存在的情況下,才能達到這個目的,所以,我認為有兩個方法可以解決:
- 把無效的key也儲存到Redis裡面,並且設定一個特殊的值,比如“null”,這樣的話下次再來訪問,就不會去查資料庫了。
但是如果攻擊者不斷用隨機的不存在的key來訪問,也還是會存在問題,所以可以用布隆過濾器來實現,在系統啟動的時候把目標資料全部快取到布隆過濾器裡面,當攻擊者用不存在的key來請求的時候,先到布隆過濾器裡面查詢,如果不存在,那意味著這個key在資料庫裡面也不存在。
布隆過濾器還有一個好處,就是它採用了bitmap來進行資料儲存,佔用的記憶體空間很少。
不過,在我看來,您提出來的這個問題,有點過於放大了它帶來的影響。
首先,在一個成熟的系統裡面,對於比較重要的熱點資料,必然會有一個專門快取系統來維護,同時它的過期時間的維護必然和其他業務的key會有一定的差別。而且非常重要的場景,我們還會設計多級快取系統。
其次,即便是觸發了快取雪崩,資料庫本身的容災能力也並沒有那麼脆弱,資料庫的主從、雙主、讀寫分離這些策略都能夠很好的緩解併發流量。
最後,資料庫本身也有最大連線數的限制,超過限制的請求會被拒絕,再結合熔斷機制,也能夠很好的保護資料庫系統,最多就是造成部分使用者體驗不好。
另外,在程式設計上,為了避免快取未命中導致大量請求穿透到資料庫的問題,還可以在訪問資料庫這個環節加鎖。雖然影響了效能,但是對系統是安全的。
總而言之,我認為解決的辦法很多,具體選擇哪種方式,還是看具體的業務場景。
以上就是我對這個問題的理解。
總結
我發現現在很多面試,真的是為了面試而面試,要麼就是在網上摘題,要麼就是不斷的問一些無關痛癢的問題。
至於最終面試官怎麼判斷你是否合適,我們也不知道,估計就是有些小夥伴說的,看長相,看眼緣!
我認為一個合格的面試官,他必須要具備非常深厚的技術功底。
本期的普通人VS高手面試系列就到這裡結束了,喜歡的朋友記得點贊和收藏。
另外,有任何技術上的問題,職業發展有關的問題,都可以私信我,我會在第一時間回覆。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!