如何解決緩存和數據庫不一致性問題?
有兩種方案。
先來了解什么情況下會產生緩存和數據庫數據不一致。查詢數據時優先從緩存中取,如果緩存沒有就查詢數據庫并且寫入緩存。如果數據庫數據改變了則清除緩存。在正常情況下是沒有問題的。但是在服務的并發非常高的情況下,刪除了緩存此時數據庫還沒來得及更新完數據就又有查詢請求來了,這時候讀到的還是舊數據并且還會將舊數據寫入緩存。此時就造成了緩存和數據庫不一致。
第一種解決方案:延時刪除。在改變數據庫數據時清除緩存的操作延時一段時間,這段時間可以非常短,只需要保證數據庫寫操作完成就可以了。但在實際環境中我們并不知道數據庫什么時候才把數據寫完成,因此這段時間不好控制,短了的話起不到作用,長了的話影響體驗。不過在一般情況下這種方式已經可以解決問題了。
另一種方案是利用數據庫的binlog,訂閱binlog當數據完成更新時用消息來通知刪除緩存。這種方案可以確保數據庫更新操作完成并且及時更新緩存。