Java高階工程師面試實戰,5種方案告訴你
前言
在分散式系統中,快取和資料庫同時存在時,如果有寫操作,先操作資料庫還是先操作快取呢?本文將分5種方案闡述展開對比,謝謝閱讀~
快取維護方案一
如果是一讀(執行緒B)一寫(執行緒A)操作,「先操作快取,再操作資料庫」。流程圖如下所示:
-
1.執行緒A發起一個寫操作,第一步del cache
-
2.執行緒A第二步寫入新資料到DB
-
3.執行緒B發起一個讀操作,cache miss快取失效了。
-
4.執行緒B從DB獲取最新資料
-
5.執行緒B執行set cache,把從DB讀到的資料,更新到快取。
「這樣看,沒啥問題」。我們再看第二個流程圖,如下:
-
1.執行緒A發起一個寫操作,第一步del cache
-
2.此時執行緒B發起一個讀操作,cache miss
-
3.執行緒B繼續讀DB,讀出來一個老資料
-
4.然後老資料設定入cache
-
5.執行緒A寫入DB最新的資料
OK,醬紫,就有問題了吧,老資料入到快取了,「每次讀都是老資料啦,快取與資料與資料庫資料不一致了」。
快取維護方案二
上個方案是一讀一寫,如果是雙寫操作,「先操作快取,再操作資料庫」,會怎麼樣呢?
-
1.執行緒A發起一個寫操作,第一步set cache
-
2.執行緒A第二步寫入新資料到DB
-
3.執行緒B發起一個寫操作,set cache
-
4.執行緒B第二步寫入新資料到DB
「這樣看,也沒啥問題。」
-
1.執行緒A發起一個寫操作,第一步set cache
-
2.執行緒B發起一個寫操作,第一步set cache
-
3.執行緒B寫入資料庫到DB
-
4.執行緒A寫入資料庫到DB
執行完後,快取儲存的是B操作後的資料,資料庫是A操作後的資料,「快取和資料庫資料不一致」。
快取維護方案三
一寫(執行緒A)一讀(執行緒B)操作,「先操作資料庫,再操作快取」。
- 1.執行緒A發起一個寫操作,第一步write DB
最後
關於面試刷題也是有方法可言的,建議最好是按照專題來進行,然後由基礎到高階,由淺入深來,效果會更好。當然,這些內容我也全部整理在一份pdf文件內,分成了以下幾大專題:
- Java基礎部分
- 演算法與程式設計
- 資料庫部分
- 流行的框架與新技術(Spring+SpringCloud+SpringCloudAlibaba)
這份面試文件當然不止這些內容,實際上像JVM、設計模式、ZK、MQ、資料結構等其他部分的面試內容均有涉及,因為文章篇幅,就不全部在這裡闡述了。
作為一名程式設計師,階段性的學習是必不可少的,而且需要保持一定的持續性,這次在這個階段內,我對一些重點的知識點進行了系統的複習,一方面鞏固了自己的基礎,另一方面也提升了自己的知識廣度和深度。
最後提醒一下哦,如果你想要學習,卻無奈於沒有乾貨學習資料,以上所有的資料內容都可以免費分享給你,只需你多多支援一下即可