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