數據讀取的時候:
先查緩存,緩存查不到查數據庫,然后把查到的結果放到緩存中。這些都基本上沒有爭議。
但是數據更新的時候:
到底是先更新數據庫,還是再更新(or刪除)緩存
or 先更新(or刪除)緩存,再更新數據庫。
一直存在很大的爭議。幾種實現方式都會出現數據一致性問題。
我就說說目前我們系統是怎么做的:
0、先確認緩存命中率。不要動不動就上緩存,有些緩存命中率根本毫無意義,比如涉及到和賬戶相關的資產、訂單等信息,就算放入緩存中,只有用戶自己會去查自己的信息,命中率極低。
一般是把與賬戶無關,且查詢量較大的放入緩存中。
1、緩存設置過期時間,保證最終一致性。
2、先更新數據庫,再刪除緩存。
可能會出現更新數據庫后,刪除緩存失敗,導致緩存是舊數據,數據庫是新數據,出現不一致性。
但是這種概率非常低。
而且刪除緩存失敗后,我們也可以做一些處理。
為什么是刪除緩存,而不是更新緩存。
因為緩存不一定直接是數據庫中的內容,有可能是多個字段計算出來的,如果每次更新都去寫緩存,會導致性能消耗。
為什么不是先刪除緩存,再更新數據庫。
因為先刪除緩存,如果在更新操作還沒commit的時候,另外一個線程進來讀取數據,緩存查不到,查數據庫並放入緩存。然后第一個更新操作commit了。
導致緩存是舊數據,而數據庫是新數據。且不會像前面提到的刪除緩存失敗那樣方便做處理。
如果業務要求強一致性,則盡可能不用緩存。
