簡單看看緩存一致性的幾種做法

聲明:本文僅限于簡書發(fā)布抖僵,其他第三方網(wǎng)站均為盜版冠摄,原文地址: 簡單看看緩存一致性的幾種做法

緩存是個(gè)好東西,一個(gè)好的緩存算法[4]可以讓我們系統(tǒng)的吞吐能力輕松上升一個(gè)到兩個(gè)數(shù)量級。當(dāng)只有唯一的操作緩存的接口時(shí)意蛀,一切都很簡單淆珊;但是夺饲,一旦有兩個(gè)或以上的操作接口時(shí),事情就會(huì)變得復(fù)雜施符,其核心的問題就是緩存會(huì)被失效往声,這個(gè)時(shí)候該怎么處理是個(gè)值得探究的問題,而我嘗試以我的了解戳吝,以 Python 代碼為示例浩销,做一下小結(jié)。

這是一張展示現(xiàn)代計(jì)算機(jī)各個(gè)不同存儲模塊的性能對比圖听哭,摘自:《深入理解計(jì)算機(jī)系統(tǒng)》

緩存會(huì)失效慢洋,大多數(shù)情況是因?yàn)閿?shù)據(jù)被修改了塘雳,還有少數(shù)情況是被刪除了,所以普筹,我們先關(guān)注一下修改的問題粉捻。對于修改被緩存數(shù)據(jù)的策略比較常見的有三種:

  • 直寫:write-through
  • 繞寫:write-around
  • 回寫:write-back

雖然緩存不是一個(gè)依賴于語言的東西,但是為了更好得解釋以及讓我的邏輯更清晰斑芜,這里我就使用簡單的Python 代碼作為示例肩刃,希望能夠以更容易理解的方式,來模擬不同的這些緩存策略杏头,從而闡述我的理解盈包。

緩存是存儲數(shù)據(jù)的硬件或軟件組件,因此可以更快地響應(yīng)對數(shù)據(jù)的請求醇王。當(dāng)然呢燥,這些數(shù)據(jù)肯定要存儲在一個(gè)自身響應(yīng)速度快于實(shí)際存儲的地方(速度對比見上圖)。例如寓娩,如果您在內(nèi)存中存儲值叛氨,則訪問數(shù)據(jù)通常會(huì)比訪問數(shù)據(jù)庫更快,因?yàn)槟强墒菑拇疟P讀取數(shù)據(jù)啊棘伴。

下面寞埠,我要開始我的表演了,就寫兩個(gè) Python代碼 來表示后臺存儲和緩存先吧:

這里有兩個(gè)類

  • BackingStore:用來表示我們直接從數(shù)據(jù)庫/磁盤中讀取數(shù)據(jù)焊夸,也就是比較慢的數(shù)據(jù)操作
  • Cache:表示從緩存中讀取數(shù)據(jù)仁连,也就是很快得數(shù)據(jù)操作

下面就以這個(gè)為框架,一一得介紹我的理解阱穗。

直寫:write-through

直寫的意思就是在數(shù)據(jù)更新時(shí)饭冬,同時(shí)寫入緩存Cache和后端存儲。我們用代碼來描述一下就是:

這里的可以看到 Line 12揪阶,直寫操作表示 cache 和 真實(shí)數(shù)據(jù)存儲都要同時(shí)更新才能成功昌抠,這種方法很不錯(cuò),你更新成功之后鲁僚,可以保證緩存和真實(shí)的數(shù)據(jù)保持一致炊苫,但是,問題也很明顯蕴茴,第一個(gè)就是劝评,我們更新的速度會(huì)很慢,還有萬一更新過程中出錯(cuò)了呢倦淀?具體對比我們后續(xù)說蒋畜,下面再看看其他的。

回寫:write-back

這種方式就簡單多了撞叽,具體操作就是只更新緩存姻成,只有當(dāng)緩存被替換時(shí)才進(jìn)行持久化插龄,代碼示例是這樣的:

這種方式我們很明顯就可以看出來,速度很快科展,因?yàn)楦静簧婕暗胶蠖说臄?shù)據(jù)存儲操作均牢,但是玄叠,缺點(diǎn)也很明顯啊苫费,我們得關(guān)注緩存是不是被替換了监氢,而且還有萬一緩存就崩了呢此衅?

繞寫:write-around

既然只寫緩存風(fēng)險(xiǎn)那么大,那我就直接寫后端數(shù)據(jù)饮潦,這樣讓緩存自動(dòng)失效之后银觅,再刷新一遍首繁,代碼這么看:

這種方式的話優(yōu)點(diǎn)是可以保證最終的持久數(shù)據(jù)是正確的坞琴,但是哨查,因?yàn)槲覀儧]有讓緩存失效,所以只能等緩存主動(dòng)失效之后再讀取持久數(shù)據(jù)剧辐,同時(shí)寒亥,更新速度也不快。

對比

基本方式我們上面都介紹過了荧关,但是溉奕,只是簡單得說說各種方式的優(yōu)缺點(diǎn),并沒有揉碎了好好說羞酗,所以腐宋,下面就以一張 Excel 表進(jìn)行介紹,看看具體的對比:

這里可以看出檀轨,各種套路都有自己的優(yōu)缺點(diǎn),我們可以根據(jù)自己項(xiàng)目的需要進(jìn)行選擇欺嗤,但是参萄,通常來說,我們引入緩存是因?yàn)樽x多寫少煎饼,所以可能繞寫(Write-Around)用的更多讹挎,而且常常配合刪除緩存的方法,從而讓緩存更新吆玖。但是筒溃,我們需要清晰得知道刪除緩存會(huì)帶來什么問題,我們是否已經(jīng)注意到這個(gè)問題并且避免了或者不在乎這些問題沾乘,具體的討論可以參考[8]怜奖。

本文的代碼都托管在 Github:Git Code

Reference

  1. Understanding write-through, write-around and write-back caching (with Python)
  2. 緩存一致性(Cache Coherency)入門
  3. Cache coherency primer
  4. 常見緩存算法和緩存策略
  5. 緩存相關(guān)——緩存穿透、緩存并發(fā)翅阵、緩存失效歪玲、緩存預(yù)熱迁央、緩存雪崩、緩存算法
  6. Write-through and Write-behind Caching with the CacheWriter
  7. cache algorithm
  8. 緩存更新的套路
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滥崩,一起剝皮案震驚了整個(gè)濱河市岖圈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钙皮,老刑警劉巖蜂科,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異短条,居然都是意外死亡导匣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門慌烧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逐抑,“玉大人,你說我怎么就攤上這事屹蚊〔薨保” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵汹粤,是天一觀的道長命斧。 經(jīng)常有香客問我,道長嘱兼,這世上最難降的妖魔是什么国葬? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮芹壕,結(jié)果婚禮上汇四,老公的妹妹穿的比我還像新娘。我一直安慰自己踢涌,他們只是感情好通孽,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睁壁,像睡著了一般背苦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潘明,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天行剂,我揣著相機(jī)與錄音,去河邊找鬼钳降。 笑死厚宰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牲阁。 我是一名探鬼主播固阁,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼壤躲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了备燃?” 一聲冷哼從身側(cè)響起碉克,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎并齐,沒想到半個(gè)月后漏麦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡况褪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年撕贞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测垛。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捏膨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出食侮,到底是詐尸還是另有隱情号涯,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布锯七,位于F島的核電站链快,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏眉尸。R本人自食惡果不足惜域蜗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望噪猾。 院中可真熱鬧霉祸,春花似錦、人聲如沸袱蜡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戒劫。三九已至,卻和暖如春婆廊,著一層夾襖步出監(jiān)牢的瞬間迅细,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工淘邻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茵典,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓宾舅,卻偏偏與公主長得像统阿,于是被迫代替她去往敵國和親彩倚。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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

  • 一扶平、簡介 Ehcache是一個(gè)用Java實(shí)現(xiàn)的使用簡單帆离,高速,實(shí)現(xiàn)線程安全的緩存管理類庫结澄,ehcache提供了用內(nèi)...
    小程故事多閱讀 43,878評論 9 59
  • 理論總結(jié) 它要解決什么樣的問題哥谷? 數(shù)據(jù)的訪問、存取麻献、計(jì)算太慢们妥、太不穩(wěn)定、太消耗資源勉吻,同時(shí)监婶,這樣的操作存在重復(fù)性。因...
    jiangmo閱讀 2,858評論 0 11
  • 本文是RAD Game Tools程序員Fabian “ryg” Giesen在其博客上發(fā)表的《Cache coh...
    kneep閱讀 1,874評論 1 13
  • 緣起 看到好些人在寫更新緩存數(shù)據(jù)代碼時(shí)齿桃,先刪除緩存惑惶,然后再更新數(shù)據(jù)庫,而后續(xù)的操作會(huì)把數(shù)據(jù)再裝載的緩存中源譬。然而集惋,這...
    jiangmo閱讀 354評論 0 0
  • 1. 使用方式 1.1 按照正常流程打包APK 1.2 修改渠道文件channels.txt 文件內(nèi)的每一行一個(gè)渠...
    隔壁_老王閱讀 1,073評論 0 2