Redis緩存數(shù)據(jù)一致性

來源:https://ouyblog.com/2017/04/Redis%E7%BC%93%E5%AD%98%E6%95%B0%E6%8D%AE%E4%B8%80%E8%87%B4%E6%80%A7

在互聯(lián)網(wǎng)行業(yè),使用緩存來提升應用的性能已經(jīng)是一件非常常見的手段侨拦,但是如何保證緩存與數(shù)據(jù)庫的一致性確不是一件容易的事。比如下面的場景都可會導致數(shù)據(jù)不一致性阳谍。

場景1:更新數(shù)據(jù)庫成功,更新緩存失敗螃概,數(shù)據(jù)不一致;
場景2:更新緩存成功吊洼,更新數(shù)據(jù)庫失敗训貌,數(shù)據(jù)不一致冒窍;
場景3:更新數(shù)據(jù)庫成功,清除緩存失敗综液,數(shù)據(jù)不一致;
場景4:清除緩存成功谬莹,更新數(shù)據(jù)庫失敗檩奠,數(shù)據(jù)弱一致桩了;

緩存和數(shù)據(jù)庫是兩類不同的存儲資源,如果要追求絕對的數(shù)據(jù)一致性埠戳,唯一的辦法就是分布式事務井誉。但使用分布式事務又會引入嚴重的寫入性能損耗,在大多數(shù)情況下整胃,業(yè)務上是無法接受這樣的損耗的颗圣。所以更多的時候,我們追求的是數(shù)據(jù)的最終一致性屁使,一種比較折中的實現(xiàn)是這樣的:

寫操作 讀操作

  1. 清除緩存在岂;若失敗則返回錯誤信息(本次寫操作失敗)屋灌。
  2. 更新數(shù)據(jù)庫洁段;若失敗則返回錯誤信息(本次寫操作失敗)共郭,此時數(shù)據(jù)弱一致祠丝。
  3. 更新緩存,即使失敗也返回成功除嘹,此時數(shù)據(jù)弱一致写半。 1. 查詢緩存,命中則直接返回結(jié)果尉咕。
  4. 查詢數(shù)據(jù)庫叠蝇,將結(jié)果直接寫入緩存,返回結(jié)果年缎。

這種實現(xiàn)簡單明了悔捶,尤其是讀操作,一看即明白单芜。對于寫操作蜕该,會有朋友問為什么第一步要先清除緩存。大家可以想想洲鸠,如果去掉第一步堂淡,那么寫操作就可能發(fā)生最開始我們提到的場景1的情況:更新數(shù)據(jù)庫成功,更新緩存失敗扒腕,數(shù)據(jù)不一致绢淀。如果在寫操作的第一步先清除緩存,對于場景1的情況瘾腰,那結(jié)果會是數(shù)據(jù)庫中有值皆的,而緩存中無值,即數(shù)據(jù)弱一致蹋盆,并不會造成業(yè)務錯誤祭务。

如果你認為上面的實現(xiàn)已經(jīng)完美内狗,那你可能會失望了怪嫌。在并發(fā)場景中义锥,它并不安全。我們看一個簡單的例子:假如有一個用戶岩灭,它的賬戶中有100塊錢“璞叮現(xiàn)在有兩個并發(fā)的請求:請求1為寫操作,更新用戶的余額噪径,從100更新為200柱恤;請求2為查詢操作找爱,查詢用戶的余額。由于是并發(fā)的车摄,兩個請求之間的執(zhí)行順序是不確定的,我們來看一下下面的執(zhí)行順序:

請求1首先清除用戶的緩存变屁。
接著請求2查詢緩存意狠,由于緩存中沒有數(shù)據(jù),請求2繼續(xù)查詢數(shù)據(jù)庫环戈,得到余額為100闷板。
請求1更新數(shù)據(jù)庫遮晚,并將結(jié)果寫入緩存迫悠。此時,數(shù)據(jù)庫與緩存中的余額都是200艺玲。
請求2將數(shù)據(jù)庫查詢結(jié)果100寫入緩存。
最終饭聚,余額在數(shù)據(jù)庫中是200搁拙,而在緩存中是100法绵,數(shù)據(jù)不一致朋譬。

造成這樣的結(jié)果兴垦,原因有兩個方面:一是寫操作中更新數(shù)據(jù)庫與更新緩存是兩個操作,而不是一個原子操作探越;二是讀操作中讀取數(shù)據(jù)庫和寫入緩存兩個操作不是原子的。要解決這個問題钦幔,需要做一些修改,引入分布式鎖:

寫操作 讀操作
1.清除緩存搀擂;若失敗則返回錯誤信息(本次寫操作失斖臁)。
2.對key加分布式鎖咆蒿。
3.更新數(shù)據(jù)庫蚂子;若失敗則返回錯誤信息(本次寫操作失敗)同時釋放鎖食茎,此時數(shù)據(jù)弱一致。
4.更新緩存附迷,即使失敗也返回成功哎媚,同時釋放鎖,此時數(shù)據(jù)弱一致稻据。 1.查詢緩存,命中則直接返回結(jié)果捻悯。
2.對key加分布式鎖。
3.查詢數(shù)據(jù)庫今缚,將結(jié)果直接寫入緩存,返回結(jié)果埠居,同時釋放鎖事期。

引入分布式鎖后的實現(xiàn)纸颜,之前的并發(fā)引起的問題不復存在,讀者可以自行驗證卵惦。不過我們仔細分析一下讀操作的實現(xiàn)铃芦,其實它還可以進一步的優(yōu)化。如果第二步加鎖的時候失敗了狂票,意味著同一時刻,有別的請求在進行同一個key的寫操作或讀操作慌盯,不論怎樣,在別的請求完成之后亚皂,緩存中應該已經(jīng)有(當然也可能沒有国瓮,寫操作和讀操作最后更新緩存失敗的情況下)我們需要的數(shù)據(jù)了,這時我們只需要等待一會再重新查詢緩存即可禁漓,所以更優(yōu)的讀操作的實現(xiàn):

查詢緩存峡懈,命中則直接返回結(jié)果。
對key加分布式鎖荚恶。如果加鎖失敗,則等待一會再重新跳回第1步開始重新執(zhí)行谒撼。
查詢數(shù)據(jù)庫,將結(jié)果直接寫入緩存廓潜,返回結(jié)果,同時釋放鎖呻畸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伤为,一起剝皮案震驚了整個濱河市据途,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颖医,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糖驴,死亡現(xiàn)場離奇詭異哪痰,居然都是意外死亡,警方通過查閱死者的電腦和手機跷睦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門抑诸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜕乡,你說我怎么就攤上這事〔懔幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵畔派,是天一觀的道長线椰。 經(jīng)常有香客問我,道長憨愉,這世上最難降的妖魔是什么卿捎? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任娇澎,我火速辦了婚禮,結(jié)果婚禮上趟庄,老公的妹妹穿的比我還像新娘戚啥。我一直安慰自己锉试,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布拖云。 她就那樣靜靜地躺著应又,像睡著了一般。 火紅的嫁衣襯著肌膚如雪株扛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天盆繁,我揣著相機與錄音旬蟋,去河邊找鬼。 笑死,一個胖子當著我的面吹牛拦惋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播架忌,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼叹放,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了井仰?” 一聲冷哼從身側(cè)響起破加,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎合是,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聪全,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡难礼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年玫锋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谦炬。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡三痰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稚机,到底是詐尸還是另有隱情获搏,我是刑警寧澤赖条,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布纬乍,位于F島的核電站,受9級特大地震影響仿贬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜓氨,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一队伟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗜侮,春花似錦、人聲如沸顷霹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渠鸽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徽缚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工排宰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留那婉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓详炬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親在跳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 雨聲太響瓷翻, 聽不見你的聲音, 不知手中的雨傘給誰割坠。 雨一直下, 看不見你的身影童谒, 不知手中的禮物送誰沪羔。 我張望著饥伊,...
    平少偉閱讀 166評論 0 0
  • 首發(fā)于Rock Chronicles 搖滾編年史 寫文章 編年史 - 79-80 - 英國后朋克 - 爆發(fā)( Po...
    爬山小王子閱讀 980評論 0 0
  • 隨意 心猿飛馬情難縛 熱世苦逐陶公術(shù) 寰宇何處不通明 最使飛蛾無由處
    陳小禪閱讀 152評論 0 0
  • 有夢想就有希望,為了夢想邁向遠方
    一天一點進步閱讀 98評論 0 0