操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    在云服務中,緩存是極其重要的一點。所謂緩存,其實是一個高速數據存儲層。當緩存存在后,日后再次請求該數據就會直接訪問緩存,提升數據訪問的速度。但是緩存存儲的數據通常是短暫性的,這就需要經常對緩存進行更新。而我們操作緩存和數據庫,分為讀操作和寫操作。

    讀操作的詳細流程為,請求數據,如緩存中存在數據則直接讀取并返回,如不存在則從數據庫中讀取,成功之后將數據放到緩存中。

    寫操作則又分為以下 4 種:

    一些一致性要求不高的數據,如點贊數等,可以先更新緩存一致性hash使用場景,然后再定時同步到數據庫。而在其它情況下,我們通常會等數據庫操作成功,再操作緩存。

    下面主要介紹更新數據庫成功后,更新緩存和刪除緩存這兩個操作的區別和改進方案。

    先更新數據庫,再刪除緩存

    先更新數據庫,再刪除緩存,這種模式也叫 cache aside,是目前比較流行的處理緩存數據庫一致性的方法。 它的優點是:

    出現數據不一致的情況出現在并發讀寫的場景下,詳情可見下圖:

    一致性hash應用場景_一致性hash使用場景_mysql使用hash查找

    這種情況發生的概率比較低,必須要在某?時間區間同時存在兩個或多個寫?和多個讀取,所以大部分業務都容忍了這種小概率的不一致。

    雖然發生的概率較低,但還是有一些方案可以讓影響降到更低。

    優化方案

    第一種方案為:采用較短的過期時間來減少影響。這種方法有兩個缺點:

    第二種方案則是采用延遲雙刪的策略,比如:1分鐘以后刪除緩存。這種做法也存在兩個缺點:

    第三種方案為雙更新策略,思路與延遲雙刪策略差不多。不同的點是,此方案不刪除緩存而是更新緩存,所以讀請求就不會發生 miss。但是另一個缺點還是存在。

    先更新數據庫,再更新緩存

    一致性hash應用場景_mysql使用hash查找_一致性hash使用場景

    相比先更新數據庫再刪除緩存的操作,先更新數據庫再更新緩存的操作可以避免用戶請求直接打到數據庫,進而導致緩存穿透的問題。

    此方案是更新緩存,我們需要關注并發讀寫和并發寫寫兩個場景下導致的數據不一致。

    先來看看并發讀寫的情況,步驟如下圖所示:

    可以看到由于 4 和 5 操作步驟都設置了緩存,如果步驟4發生在步驟5之前,那么會出現舊值覆蓋新值的情況,也就是緩存不一致的情況。這種情況只需要修改一下步驟5,便可解決。

    優化方案

    可以通過在第五步不要 set cache,改用 add cache,redis 中使用 setnx 命令來進行優化。修改后步驟示意圖如下:

    一致性hash應用場景_一致性hash使用場景_mysql使用hash查找

    解決完了并發讀寫場景導致的數據不一致,再來看看并發寫寫情況導致的數據不一致問題。

    出現不一致的情況如下圖所示, A 比 B 先更新完 DB,但是 B 卻先更新完緩存,這就導致緩存會被 A 的舊值所覆蓋。

    這種情況也是有方法可以優化的,下面介紹兩個主流方法:

    使用分布式鎖

    要解決并發讀寫的問題,第一個思路就是消滅并發寫。而使用分布式鎖,讓寫操作排隊執行,理論上就可以解決并發寫的問題,但現在并沒有可靠的分布式鎖實現方案。

    不管是基于 ,etcd 還是 redis 實現分布式鎖,為了防止程序掛掉而鎖不能釋放,我們都會給鎖設置租約/過期時間,想象一種場景:如果進程卡頓幾分鐘(雖然概率較低),導致鎖失效,而其它線程獲取到鎖一致性hash使用場景,此時就又出現了并發讀寫的場景了,還是有可能會造成數據不一致。

    一致性hash使用場景_一致性hash應用場景_mysql使用hash查找

    使用版本號

    并發寫導致的數據不一致,是因為低版本覆蓋了高版本。那么我們可以想辦法不讓這種情況發生,一種可行的方案是引入版本號,如果寫入的數據低于現版本號,則放棄覆蓋。

    缺點:

    不管是更新緩存還是刪除緩存,優化以后都將出現數據不一致的概率降到最低了。但是有沒有一種辦法既簡單,又不會出現數據不一致的場景呢。下面就介紹一下 。

    簡介

    也是一種保持緩存一致性的方法,它采用的緩存管理策略是:更新數據庫后,將緩存標記為刪除。主要通過以下兩個方法來實現:

    在運行時只要讀數據時調用 Fetch,并且確保更新數據庫之后調用 ,就能夠確保緩存最終一致。這一策略有 4 個特點:

    在 策略中,緩存中的數據是包含幾個字段的 hash:

    一致性hash應用場景_一致性hash使用場景_mysql使用hash查找

    證明

    因為 方案并不更新緩存,所以只要確保并發讀寫數據一致性即可。下面來看看 是怎么解決數據不一致的問題,先回憶一遍 cache aside 模式導致的數據不一致的原因。

    結合 cache aside 模式出現數據不一致的場景,來講講 是怎么解決的。

    我們要解決的核心問題是,防止舊值寫入到緩存中。 的解決方案是這樣的:

    至此我們已經完成了 策略下的緩存更新。不過和其他緩存更新策略一樣,我們都默認操作數據庫成功后,操作緩存肯定成功。但是這是不對的,在實際操作過程即便操作數據庫成功,也可能出現緩存操作失敗的情況,因此可以通過以下 3 種方式來保證緩存更新成功:

    除了緩存更新, 還有以下兩種功能:

    這都是非常實用的功能,推薦大家實際使用操作試試看。

    參考資料

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有