“怎么防止快取擊穿?”
這是很多一二線大廠面試的時候考察頻率較高的問題,
在并發量較高的系統中,快取可以提升資料查詢的性能,還能緩解后端存盤系統的并發壓力,可謂是屢試不爽的利器,
我把這個問題的回答,整理到了一個20W字的面試檔案里面,大家可以私信我領取,
下面看看高手的回答,
高手:
在實際應用中,我們會在程式和資料庫之間增加一個快取層,
一方面是為了提升資料檢索效率,提升程式性能,另一方面是為了緩解資料庫的并發壓力,

快取擊穿,表示請求因為某些原因全部打到了資料庫,快取并沒有起到流量緩沖的作用,
我認為有2種情況會導致快取擊穿,
-
在Redis里面保存的熱點key,在快取過期的瞬間,有大量請求進來,導致請求全部打在資料庫上,
-
客戶端惡意發起大量不存在的key的請求,由于訪問的key對應的資料本身就不存在,所以每次必然都會穿透到資料庫,導致快取成為了擺設,
總之,當Redis承擔了流量緩沖功能的時候,就需要考慮到Redis失效導致并發壓力過大對后端存盤設備造成沖擊的問題,
因此,我認為可以通過幾種方法來解決,
-
對于熱點資料,我們可以不設定過期時間,或者在訪問資料的時候對資料過期時間進行續期,
-
對于訪問量較高的快取資料,我們可以設計多級快取,盡量減少后端存盤設備的壓力,
-
使用分布式鎖,當發現快取失效的時候,不是先從資料庫加載,而是先獲取分布式鎖,獲得分布式鎖的執行緒從資料庫查詢資料后寫回到快取里面,
后續沒有獲得鎖的執行緒就只需要等待和重試即可,
這個方案犧牲了一定的性能,但是確保護了資料庫避免被壓垮,
-
對于惡意攻擊類的場景,可以使用布隆過濾器,應用啟動的時候把存在的資料快取到布隆過濾器里面,
每一次請求進來的時候先訪問布隆過濾器,
如果不存在,則說明這個資料一定沒有在資料庫里面,就沒必要再去訪問資料庫了,
另外,我們在整個快取架構設計中,除了盡可能避免快取穿透的問題,還需要從全域視角做整體考慮
比如業務隔離、多級快取、部署隔離、安全性考慮等,
總結
在我看來,很多面試題,其實更多的是考察求職者的技術底蘊以及思維邊界,有些問題不一定會有答案,或者說在面試的程序中不一定立刻能提出非常好的解決辦法我們只需要說大概的方向和思路即可,
大家記得點贊、收藏加關注!!!
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501237.html
標籤:Java
上一篇:面向物件ooDay2
