聊聊數據庫和緩存同步機制

  以前寫了三篇關於秒殺的文章,裏面提到了經過分佈式緩存來緩解數據庫壓力。最近有朋友私信回覆問,緩存和數據庫是如何進行同步的,經過你們的問題,讓我感到這個點確實能夠聊一下,因此今天準備寫一寫,供你們作一個參考。
redis


緩存同步的經常使用模式數據庫


緩存同步的模式,能夠按照緩存的用途(主要用於讀或者寫)分爲兩類:讀緩存的同步和寫緩存的同步。後端


讀緩存的同步:緩存



緩存預加載模式微信


提早將數據從數據庫加載到緩存,若是數據庫有寫更新,同步更新緩存。在秒殺狀況下,咱們對商品數據就按照這種模式進行處理。架構


緩存直讀模式併發


應用先查看緩存中是否有該數據,有則直接使用,若是沒有,從數據庫加載,而後放入緩存,下次之後再訪問就能夠直接從緩存中得到。分佈式


寫緩存的同步:性能



緩存直寫模式線程


在數據更新時,同時寫入緩存和數據庫。這種模式是最穩妥的辦法,可是性能會受到必定的影響。



緩存回寫模式


在數據更新時只寫入緩存。一般由一個後臺隊列檢查緩存中數據的變化,再將據寫到後端數據庫。


如何避免緩存和數據庫的數據不一樣步


上面介紹了緩存同步的模式,但光依靠模式,是不能徹底阻止數據同步是沒有問題的。好比說,有兩個線程A和B,在併發狀況下,他們若是能同時操做某條數據,因爲同一個數據進行讀寫,在數據庫層面併發的讀寫並不能保證完成順序。就有可能致使數據庫與緩存不一樣步。

因此在在緩存模式下,處理過程當中,須要經過對該數據加鎖,保證對數據的處理是嚴格按照串行處理的。


如何檢查緩存和數據庫的數據是同步的


1. 屬性中增長一個版本號或者時間戳字段,每次更新緩存後,版本號+1或者取更新時間戳,下一次寫操做前,先比較,而後再更新。

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



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

歡迎轉載,帶上如下二維碼便可

相關文章
相關標籤/搜索