之前寫了三篇關(guān)于秒殺的文章存崖,里面提到了通過分布式緩存來緩解數(shù)據(jù)庫壓力聊倔。最近有朋友私信回復(fù)問,緩存和數(shù)據(jù)庫是如何進行同步的谱秽,通過大家的問題洽蛀,讓我感到這個點確實可以聊一下,所以今天準備寫一寫疟赊,供大家做一個參考郊供。
緩存同步的常用模式
緩存同步的模式,可以按照緩存的用途(主要用于讀或者寫)分為兩類:讀緩存的同步和寫緩存的同步近哟。
讀緩存的同步:
緩存預(yù)加載模式
提前將數(shù)據(jù)從數(shù)據(jù)庫加載到緩存驮审,如果數(shù)據(jù)庫有寫更新,同步更新緩存吉执。在秒殺情況下疯淫,我們對商品數(shù)據(jù)就按照這種模式進行處理。
緩存直讀模式
應(yīng)用先查看緩存中是否有該數(shù)據(jù)戳玫,有則直接使用熙掺,如果沒有,從數(shù)據(jù)庫加載咕宿,然后放入緩存币绩,下次以后再訪問就可以直接從緩存中獲得。
寫緩存的同步:
緩存直寫模式
在數(shù)據(jù)更新時府阀,同時寫入緩存和數(shù)據(jù)庫缆镣。這種模式是最穩(wěn)妥的辦法,但是性能會受到一定的影響肌似。
緩存回寫模式
在數(shù)據(jù)更新時只寫入緩存费就。通常由一個后臺隊列檢查緩存中數(shù)據(jù)的變化诉瓦,再將據(jù)寫到后端數(shù)據(jù)庫川队。
如何避免緩存和數(shù)據(jù)庫的數(shù)據(jù)不同步
上面介紹了緩存同步的模式,但光依靠模式睬澡,是不能完全阻止數(shù)據(jù)同步是沒有問題的固额。比如說,有兩個線程A和B煞聪,在并發(fā)情況下斗躏,他們?nèi)绻芡瑫r操作某條數(shù)據(jù),由于同一個數(shù)據(jù)進行讀寫昔脯,在數(shù)據(jù)庫層面并發(fā)的讀寫并不能保證完成順序啄糙。就有可能導(dǎo)致數(shù)據(jù)庫與緩存不同步笛臣。
所以在在緩存模式下,處理過程中隧饼,需要通過對該數(shù)據(jù)加鎖沈堡,保證對數(shù)據(jù)的處理是嚴格按照串行處理的。
如何檢查緩存和數(shù)據(jù)庫的數(shù)據(jù)是同步的
1. 屬性中增加一個版本號或者時間戳字段燕雁,每次更新緩存后诞丽,版本號+1或者取更新時間戳,下一次寫操作前拐格,先比較僧免,然后再更新。
2. 建立一個定時任務(wù)捏浊,定義一個同步周期(5分鐘或者15分鐘)懂衩,定時任務(wù)會對最近一個時間周期內(nèi)數(shù)據(jù)庫中更新過的數(shù)據(jù)進行比較,于緩存(例如redis)中的數(shù)據(jù)進行匹配和比較金踪。
掃描二維碼或手動搜索微信公眾號【架構(gòu)棽眨】: ForestNotes