1. 程式人生 > >如何保持資料庫和快取的一致性

如何保持資料庫和快取的一致性

更新快取策略

失效:應用程式從cache取資料,沒有得到,則從資料庫取資料,然後將資料放入cache
命中:應用從cache取資料,若取到則返回
更新:把資料更新到資料庫,然後使cache失效
借用網上兩張圖
這裡寫圖片描述
這裡寫圖片描述

有沒有其他策略?

讀操作容易理解,現在討論一下寫的操作

如果先使cache失效,後更新資料庫,是否可行

這麼做引發的問題是,如果A,B兩個執行緒同時要更新資料,並且A,B已經都做完了刪除快取這一步,接下來,A先更新了資料庫,C執行緒讀取資料,由於快取沒有,則查資料庫,並把A更新的資料,寫入了快取,最後B更新資料庫。那麼快取和資料庫的值就不一致了。

如果先把資料庫更新,然後把cache更新(不是失效),是否可行

這麼做引發的問題是,如果A,B兩個執行緒同時做資料更新,A先更新了資料庫,B後更新資料庫,則此時資料庫裡存的是B的資料。而更新快取的時候,是B先更新了快取,而A後更新了快取,則快取裡是A的資料。這樣快取和資料庫的資料也不一致。

如果更新資料時,更新資料庫成功,而失效cache時失敗怎麼解決?

1、對刪除快取進行重試,資料的一致性要求越高,我越是重試得快。
2、定期全量更新,簡單地說,就是我定期把快取全部清掉,然後再全量載入。
3、給所有的快取一個失效期。(絕招,任何不一致,都可以靠失效期解決,失效期越短,資料一致性越高。但是失效期越短,查資料庫就會越頻繁。因此失效期應該根據業務來定)

不要快取那些對資料一致性要求很高的資料