成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高并發場景下,到底先更新緩存還是先更新數據庫?

存儲 存儲軟件 數據庫運維
在大型系統中,為了減少數據庫壓力通常會引入緩存機制,一旦引入緩存又很容易造成緩存和數據庫數據不一致,導致用戶看到的是舊數據。

 [[375473]]

本文轉載自微信公眾號「愛笑的架構師」,作者雷架。轉載本文請聯系愛笑的架構師公眾號。  

在大型系統中,為了減少數據庫壓力通常會引入緩存機制,一旦引入緩存又很容易造成緩存和數據庫數據不一致,導致用戶看到的是舊數據。

為了減少數據不一致的情況,更新緩存和數據庫的機制顯得尤為重要,接下來帶領大家踩踩坑。

Cache aside

Cache aside也就是旁路緩存,是比較常用的緩存策略。

(1)讀請求常見流程

Cache aside 讀請求

應用首先會判斷緩存是否有該數據,緩存命中直接返回數據,緩存未命中即緩存穿透到數據庫,從數據庫查詢數據然后回寫到緩存中,最后返回數據給客戶端。

(2)寫請求常見流程

Cache aside 寫請求

首先更新數據庫,然后從緩存中刪除該數據。

看了寫請求的圖之后,有些同學可能要問了:為什么要刪除緩存,直接更新不就行了?這里涉及到幾個坑,我們一步一步踩下去。

Cache aside踩坑

Cache aside策略如果用錯就會遇到深坑,下面我們來逐個踩。

踩坑一:先更新數據庫,再更新緩存

如果同時有兩個寫請求需要更新數據,每個寫請求都先更新數據庫再更新緩存,在并發場景可能會出現數據不一致的情況。

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

如上圖的執行過程:

(1)寫請求1更新數據庫,將 age 字段更新為18;

(2)寫請求2更新數據庫,將 age 字段更新為20;

(3)寫請求2更新緩存,緩存 age 設置為20;

(4)寫請求1更新緩存,緩存 age 設置為18;

執行完預期結果是數據庫 age 為20,緩存 age 為20,結果緩存 age為18,這就造成了緩存數據不是最新的,出現了臟數據。

踩坑二:先刪緩存,再更新數據庫

如果寫請求的處理流程是先刪緩存再更新數據庫,在一個讀請求和一個寫請求并發場景下可能會出現數據不一致情況。

先刪緩存,再更新數據庫

如上圖的執行過程:

(1)寫請求刪除緩存數據;

(2)讀請求查詢緩存未擊中(Hit Miss),緊接著查詢數據庫,將返回的數據回寫到緩存中;

(3)寫請求更新數據庫。

整個流程下來發現數據庫中age為20,緩存中age為18,緩存和數據庫數據不一致,緩存出現了臟數據。

踩坑三:先更新數據庫,再刪除緩存

在實際的系統中針對寫請求還是推薦先更新數據庫再刪除緩存,但是在理論上還是存在問題,以下面這個例子說明。

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

如上圖的執行過程:

(1)讀請求先查詢緩存,緩存未擊中,查詢數據庫返回數據;

(2)寫請求更新數據庫,刪除緩存;

(3)讀請求回寫緩存;

整個流程操作下來發現數據庫age為20,緩存age為18,即數據庫與緩存不一致,導致應用程序從緩存中讀到的數據都為舊數據。

但我們仔細想一下,上述問題發生的概率其實非常低,因為通常數據庫更新操作比內存操作耗時多出幾個數量級,上圖中最后一步回寫緩存(set age 18)速度非??欤ǔ诟聰祿熘巴瓿?。

如果這種極端場景出現了怎么辦?我們得想一個兜底的辦法:緩存數據設置過期時間。通常在系統中是可以允許少量的數據短時間不一致的場景出現。

Read through

在 Cache Aside 更新模式中,應用代碼需要維護兩個數據源頭:一個是緩存,一個是數據庫。而在 Read-Through 策略下,應用程序無需管理緩存和數據庫,只需要將數據庫的同步委托給緩存提供程序 Cache Provider 即可。所有數據交互都是通過抽象緩存層完成的。

Read-Through流程

如上圖,應用程序只需要與Cache Provider交互,不用關心是從緩存取還是數據庫。

在進行大量讀取時,Read-Through 可以減少數據源上的負載,也對緩存服務的故障具備一定的彈性。如果緩存服務掛了,則緩存提供程序仍然可以通過直接轉到數據源來進行操作。

Read-Through 適用于多次請求相同數據的場景,這與 Cache-Aside 策略非常相似,但是二者還是存在一些差別,這里再次強調一下:

  • 在 Cache-Aside 中,應用程序負責從數據源中獲取數據并更新到緩存。
  • 在 Read-Through 中,此邏輯通常是由獨立的緩存提供程序(Cache Provider)支持。

Write through

Write-Through 策略下,當發生數據更新(Write)時,緩存提供程序 Cache Provider 負責更新底層數據源和緩存。

緩存與數據源保持一致,并且寫入時始終通過抽象緩存層到達數據源。

Cache Provider類似一個代理的作用。

Write-Through流程

Write behind

Write behind在一些地方也被成為Write back, 簡單理解就是:應用程序更新數據時只更新緩存, Cache Provider每隔一段時間將數據刷新到數據庫中。說白了就是延遲寫入。

Write behind流程

如上圖,應用程序更新兩個數據,Cache Provider 會立即寫入緩存中,但是隔一段時間才會批量寫入數據庫中。

這種方式有優點也有缺點:

  • 優點是數據寫入速度非??欤m用于頻繁寫的場景。
  • 缺點是緩存和數據庫不是強一致性,對一致性要求高的系統慎用。

總結

學了這么多,相信大家對緩存更新的策略都已經有了清晰的認識。最后稍稍總結一下。

緩存更新的策略主要分為三種:

  • Cache aside
  • Read/Write through
  • Write behind

Cache aside 通常會先更新數據庫,然后再刪除緩存,為了兜底通常還會將數據設置緩存時間。

Read/Write through 一般是由一個 Cache Provider 對外提供讀寫操作,應用程序不用感知操作的是緩存還是數據庫。

Write behind簡單理解就是延遲寫入,Cache Provider 每隔一段時間會批量輸入數據庫,優點是應用程序寫入速度非常快。

好了,今天先到這里了,大家學會了嗎?

責任編輯:武曉燕 來源: 愛笑的架構師
相關推薦

2021-03-19 07:40:22

緩存數據庫日志

2025-06-12 09:16:54

2024-12-16 08:01:57

2023-12-27 13:44:00

數據庫系統分布式

2019-12-24 09:12:10

運維架構技術

2018-07-13 15:56:39

緩存數據庫數據

2021-01-29 10:51:48

高并發數據庫緩存

2011-03-07 17:11:21

云遷移云轉型

2018-07-06 15:04:24

緩存token線程

2024-08-20 08:19:43

2022-10-11 10:18:12

數據硬盤開機

2018-07-27 10:56:10

2024-02-01 09:51:17

數據庫緩存

2024-03-05 10:03:17

NoSQL數據庫算法

2024-12-26 15:01:29

2021-08-06 22:47:37

編程語言數據工具

2025-02-16 23:15:17

2024-03-14 08:57:04

高并發緩存更新

2020-09-04 06:32:08

緩存數據庫接口

2009-12-22 17:24:22

ADO.NET數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 全免费a级毛片免费看视频免费下 | av中文字幕在线观看 | 色综合久 | 亚洲欧美一区二区三区在线 | 国产成人叼嘿视频在线观看 | 亚洲久久久 | 日韩高清中文字幕 | 午夜成人免费视频 | 国产成人免费视频网站高清观看视频 | 欧美日韩国产一区二区三区 | 国产精品乱码一二三区的特点 | 欧美亚洲国产日韩 | 久久999| 在线免费观看视频你懂的 | 精品久久久久久久久久久久久久 | 一二三在线视频 | 国产精品爱久久久久久久 | 午夜精品一区二区三区在线播放 | 国产精品久久久久久久久婷婷 | 久久久黄色 | 一级视频黄色 | 国产精品三级 | 日韩在线中文字幕 | 欧美激情久久久 | 免费精品一区 | 久久久黄色 | 狠狠躁躁夜夜躁波多野结依 | 国产精品视频免费观看 | 亚洲福利一区 | 狠狠热视频 | 免费一级欧美在线观看视频 | 97碰碰碰| 福利成人 | 天堂亚洲网 | 久久久久久久久久久久久9999 | 国产一区二区三区免费 | 国产精品视频网 | 成人av资源在线 | www亚洲精品 | 中文字幕视频在线观看 | 国产一区二区三区在线 |