自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

究竟先操作緩存,還是數(shù)據(jù)庫?

開發(fā) 開發(fā)工具 前端
緩存存儲,也是數(shù)據(jù)的冗余,這些,是緩存的核心讀加速原理。 但是,一旦沒有命中緩存,或者一旦涉及寫操作,流程會比沒有緩存更加復雜,這些是今天要分享的話題。

緩存存儲,也是數(shù)據(jù)的冗余。

  • 數(shù)據(jù)庫訪問數(shù)據(jù),磁盤IO,慢;
  • 緩存里訪問數(shù)據(jù),存操作,快;
  • 數(shù)據(jù)庫里的熱數(shù)據(jù),可在緩存冗余一份;
  • 先訪問緩存,如果***,能大大的提升訪問速度,降低數(shù)據(jù)庫壓力;

這些,是緩存的核心讀加速原理。

但是,一旦沒有***緩存,或者一旦涉及寫操作,流程會比沒有緩存更加復雜,這些是今天要分享的話題。

[[236513]]

讀操作,如果沒有***緩存,流程是怎么樣的?

答:如下圖所示

  • 嘗試從緩存get數(shù)據(jù),結(jié)果沒有***;
  • 從數(shù)據(jù)庫獲取數(shù)據(jù),讀從庫,讀寫分離;
  • 把數(shù)據(jù)set到緩存,未來能夠***緩存;

讀操作的流程應該沒有歧義。

寫操作,流程是怎么樣的?

答:寫操作,既要操作數(shù)據(jù)庫中的數(shù)據(jù),又要操作緩存里的數(shù)據(jù)。

這里,有兩個方案:

  • 先操作數(shù)據(jù)庫,再操作緩存;
  • 先操作緩存,再操作數(shù)據(jù)庫;

并且,希望保證兩個操作的原子性,要么同時成功,要么同時失敗。

這演變?yōu)橐粋€分布式事務的問題,保證原子性十分困難,很有可能出現(xiàn)一半成功,一半失敗,接下來看下,當原子性被破壞的時候,分別會發(fā)生什么。

一、先操作數(shù)據(jù)庫,再操作緩存

如上圖,正常情況下:

  • 先操作數(shù)據(jù)庫,成功;
  • 再操作緩存(delete或者set),也成功;

但如果這兩個動作原子性被破壞:***步成功,第二步失敗,會導致,數(shù)據(jù)庫里是新數(shù)據(jù),而緩存里是舊數(shù)據(jù),業(yè)務無法接受。

畫外音:如果***步就失敗,可以返回調(diào)用方50X,不會出現(xiàn)數(shù)據(jù)不一致。

二、先操作緩存,再操作數(shù)據(jù)庫

如上圖,正常情況下:

  • 先操作緩存(delete或者set),成功;
  • 再操作數(shù)據(jù)庫,也成功;

畫外音:如果***步就失敗,也可以返回調(diào)用方50X,不會出現(xiàn)數(shù)據(jù)不一致。

如果原子性被破壞,會發(fā)生什么呢?

這里又分了兩種情況:

  • 操作緩存使用set
  • 操作緩存使用delete

使用set的情況:***步成功,第二步失敗,會導致,緩存里是set后的數(shù)據(jù),數(shù)據(jù)庫里是之前的數(shù)據(jù),數(shù)據(jù)不一致,業(yè)務無法接受。

并且,一般來說,數(shù)據(jù)最終以數(shù)據(jù)庫為準,寫緩存成功,其實并不算成功。

使用delete的情況:***步成功,第二步失敗,會導致,緩存里沒有數(shù)據(jù),數(shù)據(jù)庫里是之前的數(shù)據(jù),數(shù)據(jù)沒有不一致,對業(yè)務無影響。只是下一次讀取,會多一次cache miss。

畫外音:此時可以返回調(diào)用方50X。

最終,先操作緩存,還是先操作數(shù)據(jù)庫?

答:

(1) 讀請求,先讀緩存,如果沒有***,讀數(shù)據(jù)庫,再set回緩存

(2) 寫請求

  • 先緩存,再數(shù)據(jù)庫
  • 緩存,使用delete,而不是set

畫外音:《緩存,究竟是淘汰,還是修改?》也提到了,淘汰緩存還是修改緩存的建議。

希望大家有收獲,有不同方案歡迎討論。

末了,挖個坑:

在緩存讀取流程中,如果主從沒有同步完成,步驟二讀取到一個舊數(shù)據(jù),可能導致緩存里set一個舊數(shù)據(jù),最終導致數(shù)據(jù)庫和緩存數(shù)據(jù)不一致。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2023-12-27 13:44:00

數(shù)據(jù)庫系統(tǒng)分布式

2021-03-19 07:40:22

緩存數(shù)據(jù)庫日志

2021-01-29 10:51:48

高并發(fā)數(shù)據(jù)庫緩存

2019-12-24 09:12:10

運維架構(gòu)技術(shù)

2021-01-13 05:23:27

緩存數(shù)據(jù)庫高并發(fā)

2024-12-16 08:01:57

2020-09-04 06:32:08

緩存數(shù)據(jù)庫接口

2018-07-05 16:15:26

緩存數(shù)據(jù)cache miss

2018-07-15 08:18:44

緩存數(shù)據(jù)庫數(shù)據(jù)

2018-07-14 21:59:57

緩存數(shù)據(jù)庫數(shù)據(jù)

2018-03-28 09:26:43

數(shù)據(jù)庫緩存層優(yōu)化

2019-07-11 08:45:00

MySQL數(shù)據(jù)庫緩存

2010-09-27 14:54:38

SQL數(shù)據(jù)庫

2010-08-31 16:53:54

DHCP數(shù)據(jù)庫

2009-07-31 09:57:47

ASP.NET數(shù)據(jù)庫緩

2011-09-21 14:06:16

數(shù)據(jù)庫MongoDB

2009-12-22 17:24:22

ADO.NET數(shù)據(jù)庫

2021-02-05 10:58:28

數(shù)據(jù)存儲架構(gòu)

2024-05-08 08:37:44

2011-08-02 17:06:29

Oracle遠程數(shù)據(jù)庫創(chuàng)建DB Link
點贊
收藏

51CTO技術(shù)棧公眾號