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

聲明:本文僅限于簡書發(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è)不同存儲(chǔ)模塊的性能對比圖,摘自:《深入理解計(jì)算機(jī)系統(tǒng)》

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

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

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

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

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

這里有兩個(gè)類

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

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

直寫:write-through

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

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

回寫:write-back

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

這種方式我們很明顯就可以看出來,速度很快,因?yàn)楦静簧婕暗胶蠖说臄?shù)據(jù)存儲(chǔ)操作,但是,缺點(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容