聊聊数据库和缓存同步机制
? 之前寫了三篇關(guān)于秒殺的文章,里面提到了通過分布式緩存來緩解數(shù)據(jù)庫壓力。最近有朋友私信回復(fù)問,緩存和數(shù)據(jù)庫是如何進(jìn)行同步的,通過大家的問題,讓我感到這個(gè)點(diǎn)確實(shí)可以聊一下,所以今天準(zhǔn)備寫一寫,供大家做一個(gè)參考。
緩存同步的常用模式
緩存同步的模式,可以按照緩存的用途(主要用于讀或者寫)分為兩類:讀緩存的同步和寫緩存的同步。
讀緩存的同步:
緩存預(yù)加載模式
提前將數(shù)據(jù)從數(shù)據(jù)庫加載到緩存,如果數(shù)據(jù)庫有寫更新,同步更新緩存。在秒殺情況下,我們對(duì)商品數(shù)據(jù)就按照這種模式進(jìn)行處理。
緩存直讀模式
應(yīng)用先查看緩存中是否有該數(shù)據(jù),有則直接使用,如果沒有,從數(shù)據(jù)庫加載,然后放入緩存,下次以后再訪問就可以直接從緩存中獲得。
寫緩存的同步:
緩存直寫模式
在數(shù)據(jù)更新時(shí),同時(shí)寫入緩存和數(shù)據(jù)庫。這種模式是最穩(wěn)妥的辦法,但是性能會(huì)受到一定的影響。
緩存回寫模式
在數(shù)據(jù)更新時(shí)只寫入緩存。通常由一個(gè)后臺(tái)隊(duì)列檢查緩存中數(shù)據(jù)的變化,再將據(jù)寫到后端數(shù)據(jù)庫。
如何避免緩存和數(shù)據(jù)庫的數(shù)據(jù)不同步
上面介紹了緩存同步的模式,但光依靠模式,是不能完全阻止數(shù)據(jù)同步是沒有問題的。比如說,有兩個(gè)線程A和B,在并發(fā)情況下,他們?nèi)绻芡瑫r(shí)操作某條數(shù)據(jù),由于同一個(gè)數(shù)據(jù)進(jìn)行讀寫,在數(shù)據(jù)庫層面并發(fā)的讀寫并不能保證完成順序。就有可能導(dǎo)致數(shù)據(jù)庫與緩存不同步。
所以在在緩存模式下,處理過程中,需要通過對(duì)該數(shù)據(jù)加鎖,保證對(duì)數(shù)據(jù)的處理是嚴(yán)格按照串行處理的。
如何檢查緩存和數(shù)據(jù)庫的數(shù)據(jù)是同步的
1. 屬性中增加一個(gè)版本號(hào)或者時(shí)間戳字段,每次更新緩存后,版本號(hào)+1或者取更新時(shí)間戳,下一次寫操作前,先比較,然后再更新。
2. 建立一個(gè)定時(shí)任務(wù),定義一個(gè)同步周期(5分鐘或者15分鐘),定時(shí)任務(wù)會(huì)對(duì)最近一個(gè)時(shí)間周期內(nèi)數(shù)據(jù)庫中更新過的數(shù)據(jù)進(jìn)行比較,于緩存(例如redis)中的數(shù)據(jù)進(jìn)行匹配和比較。
掃描二維碼或手動(dòng)搜索微信公眾號(hào)【架構(gòu)棧】: ForestNotes
歡迎轉(zhuǎn)載,帶上以下二維碼即可
總結(jié)
以上是生活随笔為你收集整理的聊聊数据库和缓存同步机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ortp库使用入门
- 下一篇: 常用系统存储过程有: