偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

引入緩存后給業(yè)務(wù)帶來的問題,你看懂了嗎?

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
緩存讀取比較簡(jiǎn)單,查詢數(shù)據(jù)時(shí)首先查詢緩存,如果緩存命中,則從緩存中讀取數(shù)據(jù)。如果緩存不命中,則查詢數(shù)據(jù)庫(kù),并且更新緩存。

一、引入緩存后給業(yè)務(wù)帶來的問題

業(yè)務(wù)系統(tǒng)引入緩存之后,架構(gòu)由原來的兩層架構(gòu)變成了三層架構(gòu):

圖片圖片

由此,帶來了三個(gè)問題需要解決,分別是緩存讀取、緩存更新和緩存淘汰。

1.緩存讀取

圖片

緩存讀取比較簡(jiǎn)單,查詢數(shù)據(jù)時(shí)首先查詢緩存,如果緩存命中,則從緩存中讀取數(shù)據(jù)。如果緩存不命中,則查詢數(shù)據(jù)庫(kù),并且更新緩存。

2.緩存更新

緩存更新時(shí),在更新存儲(chǔ)和更新緩存的先后關(guān)系上,有以下幾種策略:

1)先更新數(shù)據(jù)庫(kù)再更新緩存

首先,這種方案會(huì)有線程安全的問題:

例如,同時(shí)有線程A和線程B對(duì)數(shù)據(jù)進(jìn)行更新操作,可能會(huì)出現(xiàn)下面的執(zhí)行順序。

①線程A更新了數(shù)據(jù)庫(kù)

②線程B更新了數(shù)據(jù)庫(kù)

③線程B更新了緩存

④線程A更新了緩存

此時(shí)就會(huì)出現(xiàn)數(shù)據(jù)庫(kù)中的數(shù)據(jù)與緩存的數(shù)據(jù)不一致的情況,這是因?yàn)榫€程A先更新了數(shù)據(jù)庫(kù),可能因?yàn)榫W(wǎng)絡(luò)等異常情況,線程B更新完數(shù)據(jù)庫(kù)進(jìn)而更新了緩存,當(dāng)線程B更新完緩存后,線程A才更新緩存,這就導(dǎo)致了數(shù)據(jù)庫(kù)數(shù)據(jù)與緩存數(shù)據(jù)的不一致。

其次,這種方案也有其不適用的業(yè)務(wù)場(chǎng)景:

首先一個(gè)業(yè)務(wù)場(chǎng)景就是數(shù)據(jù)庫(kù)寫多讀少的場(chǎng)景,這種場(chǎng)景下采用先更新數(shù)據(jù)庫(kù)再更新緩存的策略,就會(huì)導(dǎo)致緩存并未被讀取就會(huì)被頻繁的更新,極大的浪費(fèi)了服務(wù)器的性能。

再一個(gè)業(yè)務(wù)場(chǎng)景就是數(shù)據(jù)庫(kù)中的數(shù)據(jù)不是直接寫入緩存的,而是需要大量的復(fù)雜運(yùn)算,將運(yùn)算結(jié)果寫入緩存。如果這種場(chǎng)景下使用先更新數(shù)據(jù)庫(kù)再更新緩存的策略,也會(huì)造成服務(wù)器資源的浪費(fèi)。

2)先刪除緩存,再更新數(shù)據(jù)庫(kù)

先刪除緩存再更新數(shù)據(jù)庫(kù)的方案也存在著線程安全的問題,例如,線程A更新緩存,同時(shí),線程B讀取緩存的數(shù)據(jù)??赡軙?huì)出現(xiàn)下面的執(zhí)行順序:

①線程A刪除緩存

②線程B查詢緩存,發(fā)現(xiàn)緩存中沒有想要的數(shù)據(jù)

③線程B查詢數(shù)據(jù)庫(kù)中的舊數(shù)據(jù)

④線程B將查詢到的舊數(shù)據(jù)寫入緩存

⑤線程A將新數(shù)據(jù)寫入數(shù)據(jù)庫(kù)

此時(shí),就出現(xiàn)了數(shù)據(jù)庫(kù)中的數(shù)據(jù)和緩存中的數(shù)據(jù)不一致的情況。如果刪除緩存失敗,也會(huì)出現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)和緩存數(shù)據(jù)不一致的現(xiàn)象。

3)先更新數(shù)據(jù)庫(kù),再刪除緩存

首先,這種方式也有極小的概率發(fā)生數(shù)據(jù)庫(kù)數(shù)據(jù)和緩存數(shù)據(jù)不一致的情況,例如,線程A做查詢操作,線程B執(zhí)行更新操作,其執(zhí)行的順序如下所示:

①緩存剛好失效

②請(qǐng)求A查詢數(shù)據(jù)庫(kù),獲取到數(shù)據(jù)庫(kù)中的舊值

③請(qǐng)求B將新值寫入數(shù)據(jù)庫(kù)

④請(qǐng)求B刪除緩存

⑤請(qǐng)求A將查到的舊值寫入緩存

如果上述順序一旦發(fā)生,就會(huì)造成數(shù)據(jù)庫(kù)中的數(shù)據(jù)和緩存中的數(shù)據(jù)不一致的情況發(fā)生。但是,先更新數(shù)據(jù)庫(kù)再刪除緩存的策略發(fā)生數(shù)據(jù)庫(kù)和緩存數(shù)據(jù)不一致的概率很低,原因就是:③的寫數(shù)據(jù)庫(kù)操作比步驟②的讀數(shù)據(jù)庫(kù)操作耗時(shí)更短,才有可能使得步驟④先于步驟⑤執(zhí)行。

但是,往往數(shù)據(jù)庫(kù)的讀操作的速度遠(yuǎn)快于寫操作,因此步驟③耗時(shí)比步驟②更短這一場(chǎng)景很難出現(xiàn)。因此,先更新數(shù)據(jù)庫(kù),再刪除緩存是一種值得推薦的做法。

4)異常情況

上面的討論與對(duì)比都是在刪除緩存和更新數(shù)據(jù)庫(kù)這兩步操作都成功的情況下敘述的。當(dāng)然系統(tǒng)正常運(yùn)行時(shí)的操作基本上都是成功的,那么如果兩步操作有其中一步操作失敗了呢?以先更新數(shù)據(jù)庫(kù)再刪除緩存舉例:

  • 更新數(shù)據(jù)庫(kù)失?。哼@種情況很簡(jiǎn)單,不會(huì)影響第二步操作,也不會(huì)影響數(shù)據(jù)一致性,直接拋異常出去就好了;
  • 更新緩存失?。哼@種情況需要繼續(xù)嘗試刪除緩存,直到緩存刪除成功,可以用一個(gè)消息隊(duì)列完成,如下圖所示:

圖片圖片

①更新數(shù)據(jù)庫(kù)數(shù)據(jù);

②刪除緩存數(shù)據(jù)失?。?/p>

③將需要?jiǎng)h除的key發(fā)送至消息隊(duì)列;

④自己消費(fèi)消息,獲得需要?jiǎng)h除的key;

⑤繼續(xù)重試刪除操作,直到成功。

3.緩存淘汰

主要有兩種策略,分別是主動(dòng)淘汰和被動(dòng)淘汰:

  • 主動(dòng)淘汰:給鍵值對(duì)設(shè)置TTL時(shí)間,到期自動(dòng)淘汰(推薦),這種方式可以達(dá)到緩存熱數(shù)據(jù)的目的;
  • 被動(dòng)淘汰:內(nèi)存達(dá)到最大限制時(shí),通過LRU、LFU算法淘汰(不推薦),這種方式影響緩存性能,緩存質(zhì)量不可控。

二、緩存的三座大山

1.一致性

一致性主要解決以下幾個(gè)問題:

1)并行更新如何解決隔離性問題

  • 串行更新:?jiǎn)蝹€(gè)Key更新序列需要串行更新,保證時(shí)序
  • 并行更新:不同的key可以放到不同的Slot中,在Slot維度可以進(jìn)行并行更新,提升性能

2)原子性更新時(shí)如何解決部分更新的問題

  • 系統(tǒng)聯(lián)動(dòng):緩存&存儲(chǔ)實(shí)時(shí)同步更新狀態(tài),通過revision同步狀態(tài)
  • 部分成功:緩存更新成功,存儲(chǔ)更新失敗,觸發(fā)HA,保障寫入成功(日志冪等)

3)如何解決讀一致的問題

  • revision:每個(gè)Key都帶有一個(gè)revision,通過revision識(shí)別數(shù)據(jù)新舊
  • 淘汰控制:Redis不淘汰存儲(chǔ)未更新的數(shù)據(jù)(Redis不淘汰revision < 4的數(shù)據(jù)),保證Redis不緩存舊版本數(shù)據(jù)

2.緩存擊穿

緩存擊穿指的是訪問數(shù)據(jù)時(shí)直接繞過緩存,訪問數(shù)據(jù)庫(kù)??赡軙?huì)有兩種原因造成這種現(xiàn)象:

圖片圖片

一種是大量的空查詢,比如黑客攻擊;另外一種是緩存污染,比如大量的網(wǎng)絡(luò)爬蟲造成的。

1)為了解決空查詢帶來的緩存擊穿,主要有兩種方案:

第一種是在緩存層前面再加一層布隆過濾器,布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu)(probabilistic data structure),特點(diǎn)是高效地插入和查詢,可以用來告訴你 “某樣?xùn)|西一定不存在或者可能存在”。布隆過濾器是一個(gè) bit 向量或者說 bit 數(shù)組,長(zhǎng)這樣:

圖片圖片

如果我們要映射一個(gè)值到布隆過濾器中,我們需要使用多個(gè)不同的哈希函數(shù)生成多個(gè)哈希值,并對(duì)每個(gè)生成的哈希值指向的 bit 位置 1,例如針對(duì)值 “baidu” 和三個(gè)不同的哈希函數(shù)分別生成了哈希值 1、4、7,則上圖轉(zhuǎn)變?yōu)椋?/p>

圖片圖片

我們現(xiàn)在再存一個(gè)值 “tencent”,如果哈希函數(shù)返回 3、4、8 的話,圖繼續(xù)變?yōu)椋?/p>

圖片圖片

值得注意的是,4 這個(gè) bit 位由于兩個(gè)值的哈希函數(shù)都返回了這個(gè) bit 位,因此它被覆蓋了?,F(xiàn)在我們?nèi)绻氩樵?“dianping” 這個(gè)值是否存在,哈希函數(shù)返回了 1、5、8三個(gè)值,結(jié)果我們發(fā)現(xiàn) 5 這個(gè) bit 位上的值為 0,說明沒有任何一個(gè)值映射到這個(gè) bit 位上,因此我們可以很確定地說 “dianping” 這個(gè)值不存在。

而當(dāng)我們需要查詢 “baidu” 這個(gè)值是否存在的話,那么哈希函數(shù)必然會(huì)返回 1、4、7,然后我們檢查發(fā)現(xiàn)這三個(gè) bit 位上的值均為 1,那么我們可以說 “baidu” 存在了么?答案是不可以,只能是 “baidu” 這個(gè)值可能存在。

這是為什么呢?答案很簡(jiǎn)單,因?yàn)殡S著增加的值越來越多,被置為 1 的 bit 位也會(huì)越來越多,這樣某個(gè)值 “taobao” 即使沒有被存儲(chǔ)過,但是萬(wàn)一哈希函數(shù)返回的三個(gè) bit 位都被其他值置位了 1 ,那么程序還是會(huì)判斷 “taobao” 這個(gè)值存在。

很顯然,過小的布隆過濾器很快所有的 bit 位均為 1,那么查詢?nèi)魏沃刀紩?huì)返回“可能存在”,起不到過濾的目的了。布隆過濾器的長(zhǎng)度會(huì)直接影響誤報(bào)率,布隆過濾器越長(zhǎng)其誤報(bào)率越小。另外,哈希函數(shù)的個(gè)數(shù)也需要權(quán)衡,個(gè)數(shù)越多則布隆過濾器 bit 位置位 1 的速度越快,且布隆過濾器的效率越低;但是如果太少的話,那我們的誤報(bào)率會(huì)變高。

第二種是把所有的key和熱數(shù)據(jù)value加入緩存,在緩存層攔截空數(shù)據(jù)查詢。

圖片圖片

2)為了解決爬蟲帶來的緩存擊穿問題,可以設(shè)置緩存策略:

  • 針對(duì)更新的操作,需要立即緩存
  • 針對(duì)讀的操作,可以在設(shè)置是否立即緩沖還是延遲緩存,以及在規(guī)定的時(shí)間窗內(nèi)命中的次數(shù)是否達(dá)到一定的次數(shù)才進(jìn)行緩存

3.緩存雪崩

緩存雪崩指的是熱數(shù)據(jù)集中淘汰,大量請(qǐng)求瞬間透?jìng)鞯酱鎯?chǔ)層,導(dǎo)致存儲(chǔ)層過載。

圖片圖片

造成緩存雪崩的原因主要是TTL機(jī)制過于簡(jiǎn)單造成的,解決方案主要有以下:

  • 設(shè)置TTL時(shí)給過期時(shí)間加上一個(gè)隨機(jī)的時(shí)間值
  • 每一次的訪問都會(huì)重新更新TTL,此外業(yè)務(wù)可以更精準(zhǔn)地指定熱數(shù)據(jù)緩存時(shí)間
責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2024-08-12 12:30:27

2024-04-29 09:25:19

2022-11-28 07:10:57

2023-06-27 07:09:39

2022-06-28 08:42:03

磁盤kafka高性能

2024-09-29 08:47:55

2024-05-17 09:44:49

Kubernetes均衡器Envoy

2024-03-05 18:19:07

localhostLinux數(shù)據(jù)庫(kù)

2021-04-26 10:30:43

USB4設(shè)備Thunderbolt

2021-10-28 19:35:02

代碼main方法

2018-01-04 00:10:52

物聯(lián)網(wǎng)技術(shù)信息

2022-03-18 00:17:30

NISTICS安全

2020-10-25 08:45:38

IPv6網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)

2019-11-20 15:40:48

CPU軟件處理器

2021-10-10 20:36:49

Android Root權(quán)限

2024-04-29 09:38:16

2024-04-07 08:23:01

JS隔離JavaScript

2011-06-14 12:56:55

SQL Server復(fù)災(zāi)

2011-09-02 16:08:09

Sencha ToucAPI文檔

2022-04-07 08:20:22

typeinterface前端
點(diǎn)贊
收藏

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