百萬級抽獎系統——redis的延時雙刪——數據庫與緩存的數據一致性問題分析

百萬級抽獎系統(redis的延時雙刪)

筆記鏈接:https://www.bilibili.com/read/cv15241402?from=note

視頻鏈接:https://www.bilibili.com/video/BV1t5411o7yn

 

 

 

 

 

 

 

 

 延時雙刪的博客地址:https://blog.csdn.net/qq_35890572/article/details/108538712

【面試】太捲了!大廠面試考健康碼!如何結合八股文講好思路?

mysql數據更新,需要刪除同步redis的舊數據,就需要考慮使用延時雙刪(更新數據前刪一次緩存,更新數據後延時一段時間再刪一次緩存,讓訪問舊數據的線程執行結束,這樣刪除緩存後再次命中就更新的是新數據)

 

 

 

mysql和redis的三個情況

 

 

 

更新時會存在四種情況,對其分析緩存一致性問題

1: 換更新緩存,再更新數據庫

很笨的做法,如果更新數據庫失敗了,就需要回滾,回滾後需要回滾緩存,如果之前更新的數據是經過大量計算得到的那麼這些計算就白算了,因爲數據庫持久化更好,更好回滾,而且存儲以數據庫爲中心,所以應該先去更新數據庫。

2:先更新數據庫,再更新緩存

會導致更新的數據被拿到之前數據還沒寫redis的線程覆蓋掉。

 

 

 

3:先刪緩存,再更新數據庫

存在緩存不一致問題

 

 

4:先更新數據庫,再刪緩存

舊數據被拿到,更新後寫入redis,概率低,因爲更新時間大於寫的時間。

 

 

 

可以刪除緩存操作延時一段時間

 

 

大數據庫讀寫分離

 

同步出現問題,會導致獲取到舊數據

 

 

更新架構

直接去主mysql的日誌拿數據變更到redis,可以使canel,存在更新緩存失敗問題。從mysql相當於備份了。

 

 

引入mq,mq可以保證更新數據有序,不會亂,還能保證不丟失,消費不成功可以重複消費,redis採用單線程訂閱保證有序性,但是mq也有崩潰的存在,對於強一致性的場景就需要考慮整個流程加事物了,這個只是滿足最終一致性。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章