高並發下的緩存一致性問題


數據讀取的時候:

先查緩存,緩存查不到查數據庫,然后把查到的結果放到緩存中。這些都基本上沒有爭議。

 

但是數據更新的時候:

到底是先更新數據庫,還是再更新(or刪除)緩存

or 先更新(or刪除)緩存,再更新數據庫。

一直存在很大的爭議。幾種實現方式都會出現數據一致性問題。

 

我就說說目前我們系統是怎么做的:

0、先確認緩存命中率。不要動不動就上緩存,有些緩存命中率根本毫無意義,比如涉及到和賬戶相關的資產、訂單等信息,就算放入緩存中,只有用戶自己會去查自己的信息,命中率極低。

     一般是把與賬戶無關,且查詢量較大的放入緩存中。     

1、緩存設置過期時間,保證最終一致性。

2、先更新數據庫,再刪除緩存。

可能會出現更新數據庫后,刪除緩存失敗,導致緩存是舊數據,數據庫是新數據,出現不一致性。
但是這種概率非常低。
而且刪除緩存失敗后,我們也可以做一些處理。
 
為什么是刪除緩存,而不是更新緩存。
因為緩存不一定直接是數據庫中的內容,有可能是多個字段計算出來的,如果每次更新都去寫緩存,會導致性能消耗。
 
為什么不是先刪除緩存,再更新數據庫。
因為先刪除緩存,如果在更新操作還沒commit的時候,另外一個線程進來讀取數據,緩存查不到,查數據庫並放入緩存。然后第一個更新操作commit了。
導致緩存是舊數據,而數據庫是新數據。且不會像前面提到的刪除緩存失敗那樣方便做處理。
 
 
如果業務要求強一致性,則盡可能不用緩存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM