百萬級抽獎系統(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也有崩潰的存在,對於強一致性的場景就需要考慮整個流程加事物了,這個只是滿足最終一致性。