1. 程式人生 > >如何保證db與快取的資料一致性

如何保證db與快取的資料一致性

為了提升效能,快取在系統開發中具有普遍的應用。常見的模式是先查詢/更新db後再去更新快取,那麼如何保證db和快取的資料一致性的問題是實際開發中經常遇到的問題。這種場景下容易造成資料不一致的問題主要是快取雙寫。

一、快取雙寫問題

先查詢或者更新db,然後再更新快取,這裡可能出現的一種不一致的情況是db更新或查詢成功,但是快取更新失敗了,這個不一致的問題可以通過重試更新快取的方式來解決,保證最終一致性。但是這個方案只適用於只有一個更新快取的執行緒的場景。

如果有多個執行緒同時更新快取呢,也就是雙寫,比如查詢執行緒A查詢到資料後要更新快取,此時另一個更新執行緒B在完成db的更新後也要更新快取,這個時候,執行緒A可能在查詢時db還沒有完成更新,查到的是老資料,如果最終執行緒A後於B更新快取,則快取中最終的資料則是舊的資料,就會出現db和快取資料不一致的情況。

二、解決方案

解決這個問題的關鍵是如何保證多個執行緒更新有序性,化並行為序列是解決這個問題的基本思路。在這裡我們可以考慮引入佇列的方式來解決,通過佇列來保證執行緒更新的有序性。

mq的選型比較建議使用訊息佇列,比如rabbitmq,rocketmq等,消費端保證只有一個執行緒順序消費訊息即可。如果要增大吞吐量,可以使用多個佇列,每個佇列對應一個消費者。使用訊息佇列可以充分利用其特性,比如訊息的持久化,訊息消費失敗後的重試等,可以更好的保證資料的最終一致性。

更多內容歡迎關注個人微信公眾號,一起成長!