数据库和缓存一致性的问题
經常看到有人問怎么解決數據庫和緩存一致性的問題,這個問題我覺得是不要去解決。
如果你不信你先看我列的幾種情況
?
假設
數據庫一開始和緩存都是1元。
用戶更新數據庫的同時雙寫緩存。
?
1.雙寫不刪
寫庫充值10元>>>返回成功
-----
時間間隔
<<<讀緩存 返回舊的1元 ? 這是錯的
時間間隔
-----
寫緩存充值10元>>>
<<<讀緩存 返回新的10元 ? 這是對的
2.雙寫先刪緩存成功 ?【理想情況】
<<<讀緩存 舊的1元 ?這是對的 因為還沒有寫
寫庫充值10元>>>
-----
時間間隔
<<<讀緩存 沒有數據 讀數據庫10元 ?緩存之
時間間隔
-----
寫緩存>>> 寫10元 實際上重復寫?
3.雙寫先刪緩存失敗了 ?【異常不補償情況】?
這里需要第一次補償么?
寫庫充值10元>>>
-----
時間間隔
<<<讀緩存 舊的1元 ?這是錯的
時間間隔
-----
寫緩存>>> 寫10元 又失敗 ? ?這里需要補償么?
<<<讀緩存 舊的1元 ?這是錯的
4.雙寫先刪緩存失敗了 ?【異常補償情況】?
第一次補償沒有補償完
寫庫充值10元>>>
-----
時間間隔
<<<讀緩存 舊的1元 ?這是錯的
時間間隔
第一次補償補償完
<<<讀緩存 沒有數據 讀數據庫10元 ?緩存之
-----
其實補償不能徹底解決問題,因為補償間隙讀的數據都是錯的!
如果你為了解決這個一致性問題引入分布式鎖,分布式事務等你就陷入了CAP的泥潭。
你的系統性能會好么?就不會引入新的問題么?
所以緩存就是緩存,要設過期時間,實時性要求比較高的比如充值直接讀數據庫。
數據庫并發高需要分庫分表。
總結
以上是生活随笔為你收集整理的数据库和缓存一致性的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能真的能实现吗?有了人工智能到时候
- 下一篇: Spring Boot集成Swagger