Redis 與數(shù)據(jù)庫的一致性


title: Redis 與數(shù)據(jù)庫的一致性
date: 2021/05/26 17:00


首先脉顿,給緩存設(shè)置過期時間是可以保證最終一致性的解決方案腺办,所以接下來的方案是保障緩存與數(shù)據(jù)庫數(shù)據(jù)盡可能的更快一致

方案主要分為以下四種情況:

  1. 先更新數(shù)據(jù)庫,再更新緩存
  2. 先更新緩存,再更新數(shù)據(jù)庫
  3. 先刪除緩存擎场,再更新數(shù)據(jù)庫
  4. 先更新數(shù)據(jù)庫,再刪除緩存

更新緩存 VS 刪除緩存

更新緩存: 數(shù)據(jù)不但寫入數(shù)據(jù)庫几莽,還會寫入緩存
刪除緩存: 數(shù)據(jù)只會寫入數(shù)據(jù)庫迅办,不會寫入緩存,只會刪除緩存

優(yōu)點(diǎn)對比

  • 更新緩存的優(yōu)點(diǎn): 緩存不會增加一次Miss章蚣,命中率高
  • 刪除緩存的優(yōu)點(diǎn): 操作簡單礼饱,能防止更新出現(xiàn)的線程安全問題

那到底是選擇更新緩存還是刪除緩存呢,主要取決于更新緩存的復(fù)雜度,如果更新緩存的代價很小镊绪,此時我們應(yīng)該更傾向于更新緩存,以保證更高的緩存命中率洒忧;如果更新緩存的代價很大蝴韭,此時我們應(yīng)該更傾向于刪除緩存。

例如:

  1. 只是簡單的更新一下用戶余額熙侍,只操作一個字段榄鉴,那就可以采用更新緩存
  2. 還有類似秒殺下商品庫存數(shù)量這種并發(fā)下查詢頻繁的數(shù)據(jù),也可以使用更新緩存

不過這種更新數(shù)值蛉抓,要注意線程安全的問題庆尘,防止產(chǎn)生臟數(shù)據(jù)

主要還是要以業(yè)務(wù)場景為主進(jìn)行選擇。不過大部分場景下刪除緩存操作簡單巷送,并且?guī)淼母弊饔弥皇窃黾恿艘淮蜟ache Miss驶忌,建議作為通用的處理方式

先更新數(shù)據(jù)庫笑跛,再更新緩存

這種方式就適合更新緩存的代價很小的數(shù)據(jù)付魔,例如上面說的余額,庫存數(shù)量這類數(shù)據(jù)飞蹂,不過要注意線程安全的問題几苍。

線程安全角度

同時有請求A和請求B進(jìn)行更新操作,那么會出現(xiàn)

  1. 線程A更新了數(shù)據(jù)庫
  2. 線程B更新了數(shù)據(jù)庫
  3. 線程B更新了緩存
  4. 線程A更新了緩存

這就出現(xiàn)請求A更新緩存應(yīng)該比請求B更新緩存早才對陈哑,但是因?yàn)榫W(wǎng)絡(luò)等原因妻坝,B卻比A更早更新了緩存,這就導(dǎo)致了臟數(shù)據(jù)

業(yè)務(wù)場景角度

有如下兩種不適合場景

  1. 如果你是一個寫數(shù)據(jù)庫場景比較多惊窖,而讀數(shù)據(jù)場景比較少的業(yè)務(wù)需求刽宪,采用這種方案就會導(dǎo)致,數(shù)據(jù)壓根還沒讀到爬坑,緩存就被頻繁的更新纠屋,浪費(fèi)性能;但是這種場景做啥緩存呢盾计?

  2. 如果你寫入數(shù)據(jù)庫的值售担,并不是直接寫入緩存的,而是要經(jīng)過一系列復(fù)雜的計算再寫入緩存署辉。那么族铆,每次寫入數(shù)據(jù)庫后,都再次計算寫入緩存的值哭尝,無疑是也浪費(fèi)性能的

先更新緩存哥攘,再更新數(shù)據(jù)庫

本來這種情況應(yīng)該是和第一種情況一樣會存在線程安全問題的,但是這種情況是有人使用過的,根據(jù)書籍《淘寶技術(shù)這十年》里逝淹,多隆把商品詳情頁放入緩存耕姊,采取的正是先更新緩存,再將緩存中的數(shù)據(jù)異步更新到數(shù)據(jù)庫這種方式栅葡,有興趣了解的可以查看這篇博客: https://www.cnblogs.com/rjzheng/p/9240611.html

還有現(xiàn)在互聯(lián)網(wǎng)常見的點(diǎn)贊功能茉兰,也可以采用這種方式,有興趣了解的可以查看這篇文章: https://juejin.im/post/5bdc257e6fb9a049ba410098

先刪除緩存欣簇,再更新數(shù)據(jù)庫

簡單的想一下规脸,好像這種方式不錯,就算是第一步刪除緩存成功熊咽,第二步寫數(shù)據(jù)庫失敗莫鸭,則只會引發(fā)一次Cache Miss,對數(shù)據(jù)沒有影響横殴,其實(shí)仔細(xì)一想并發(fā)下也很容易導(dǎo)致了臟數(shù)據(jù)被因,例如

  1. 請求A進(jìn)行寫操作,刪除緩存
  2. 請求B查詢發(fā)現(xiàn)緩存不存在
  3. 請求B去數(shù)據(jù)庫查詢得到舊值
  4. 請求B將舊值寫入緩存
  5. 請求A將新值寫入數(shù)據(jù)庫

那怎么解決呢滥玷,不著急氏身,先看第四種情況,后面再統(tǒng)一說第三種和第四種的解決方案

先更新數(shù)據(jù)庫惑畴,再刪除緩存

這種方式也存在上面的問題蛋欣,但是出現(xiàn)的概率比上面那種方式低,例如:

  1. 請求緩存剛好失效
  2. 請求A查詢數(shù)據(jù)庫如贷,得一個舊值
  3. 請求B將新值寫入數(shù)據(jù)庫
  4. 請求B刪除緩存
  5. 請求A將查到的舊值寫入緩存

這樣就出現(xiàn)臟數(shù)據(jù)了陷虎,然而,實(shí)際上出現(xiàn)的概率可能非常低杠袱,因?yàn)檫@個條件需要發(fā)生在讀緩存時緩存失效尚猿,而且并發(fā)著有一個寫操作。而實(shí)際上數(shù)據(jù)庫的寫操作會比讀操作慢得多楣富,而且還要鎖表凿掂,而讀操作必需在寫操作前進(jìn)入數(shù)據(jù)庫操作,而又要晚于寫操作刪除緩存纹蝴,所有的這些條件都具備的概率基本并不大庄萎,但是還是會有出現(xiàn)的概率

并且假如第一步寫數(shù)據(jù)庫成功塘安,第二步刪除緩存失敗糠涛,這樣也導(dǎo)致臟數(shù)據(jù)

為了應(yīng)對這種問題兼犯,所以提出了延時雙刪策略忍捡。

延時雙刪策略

第三種方案并發(fā)問題解決方案:

  1. 先刪除(淘汰)緩存
  2. 再寫數(shù)據(jù)庫(這兩步和原來一樣)
  3. 休眠1秒集漾,再次刪除(淘汰)緩

第四種方案并發(fā)問題解決方案:

  1. 先寫數(shù)據(jù)庫
  2. 再刪除(淘汰)緩存(這兩步和原來一樣)
  3. 休眠1秒,再次刪除(淘汰)緩存

這個1秒應(yīng)該看你的業(yè)務(wù)場景砸脊,應(yīng)該自行評估自己的項目的讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時具篇,然后寫數(shù)據(jù)的休眠時間則在讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時基礎(chǔ)上,加幾百ms即可(以保證拿到舊數(shù)據(jù)的線程把數(shù)據(jù)保存到了 redis)凌埂,這么做確保讀請求結(jié)束栽连,寫請求可以刪除讀請求造成的緩存臟數(shù)據(jù)

參考文章

Redis與數(shù)據(jù)庫一致性

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侨舆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绢陌,老刑警劉巖挨下,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脐湾,居然都是意外死亡臭笆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門秤掌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愁铺,“玉大人,你說我怎么就攤上這事闻鉴∫鹇遥” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵孟岛,是天一觀的道長瓶竭。 經(jīng)常有香客問我,道長渠羞,這世上最難降的妖魔是什么斤贰? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮次询,結(jié)果婚禮上荧恍,老公的妹妹穿的比我還像新娘。我一直安慰自己屯吊,他們只是感情好送巡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雌芽,像睡著了一般授艰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上世落,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天淮腾,我揣著相機(jī)與錄音糟需,去河邊找鬼。 笑死谷朝,一個胖子當(dāng)著我的面吹牛洲押,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圆凰,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼杈帐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了专钉?” 一聲冷哼從身側(cè)響起挑童,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跃须,沒想到半個月后站叼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菇民,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年尽楔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片第练。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡阔馋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娇掏,到底是詐尸還是另有隱情呕寝,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布驹碍,位于F島的核電站壁涎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏志秃。R本人自食惡果不足惜怔球,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浮还。 院中可真熱鬧竟坛,春花似錦、人聲如沸钧舌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洼冻。三九已至崭歧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撞牢,已是汗流浹背率碾。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工叔营, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人所宰。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓绒尊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仔粥。 傳聞我的和親對象是個殘疾皇子婴谱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容