聊聊資料庫和快取同步機制

ForestXie發表於2017-07-24

  之前寫了三篇關於秒殺的文章,裡面提到了通過分散式快取來緩解資料庫壓力。最近有朋友私信回覆問,快取和資料庫是如何進行同步的,通過大家的問題,讓我感到這個點確實可以聊一下,所以今天準備寫一寫,供大家做一個參考。


快取同步的常用模式


快取同步的模式,可以按照快取的用途(主要用於讀或者寫)分為兩類:讀快取的同步和寫快取的同步。


讀快取的同步:



快取預載入模式


提前將資料從資料庫載入到快取,如果資料庫有寫更新,同步更新快取。在秒殺情況下,我們對商品資料就按照這種模式進行處理。


快取直讀模式


應用先檢視快取中是否有該資料,有則直接使用,如果沒有,從資料庫載入,然後放入快取,下次以後再訪問就可以直接從快取中獲得。


寫快取的同步:



快取直寫模式


在資料更新時,同時寫入快取和資料庫。這種模式是最穩妥的辦法,但是效能會受到一定的影響。



快取回寫模式


在資料更新時只寫入快取。通常由一個後臺佇列檢查快取中資料的變化,再將據寫到後端資料庫。


如何避免快取和資料庫的資料不同步


上面介紹了快取同步的模式,但光依靠模式,是不能完全阻止資料同步是沒有問題的。比如說,有兩個執行緒A和B,在併發情況下,他們如果能同時操作某條資料,由於同一個資料進行讀寫,在資料庫層面併發的讀寫並不能保證完成順序。就有可能導致資料庫與快取不同步。

所以在在快取模式下,處理過程中,需要通過對該資料加鎖,保證對資料的處理是嚴格按照序列處理的。


如何檢查快取和資料庫的資料是同步的


1. 屬性中增加一個版本號或者時間戳欄位,每次更新快取後,版本號+1或者取更新時間戳,下一次寫操作前,先比較,然後再更新。

2. 建立一個定時任務,定義一個同步週期(5分鐘或者15分鐘),定時任務會對最近一個時間週期內資料庫中更新過的資料進行比較,於快取(例如redis)中的資料進行匹配和比較。



掃描二維碼或手動搜尋微信公眾號【架構棧】: ForestNotes

歡迎轉載,帶上以下二維碼即可

聊聊資料庫和快取同步機制

相關文章