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

分布式系統(tǒng)「高性能」大招之——緩存背后的“毀滅種子”

存儲(chǔ) 存儲(chǔ)軟件 分布式
布隆過(guò)濾器就是由一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)組成,將確定不存在的數(shù)據(jù)構(gòu)建到過(guò)濾器中,用它來(lái)過(guò)濾請(qǐng)求。

[[332833]]

緩存雪崩

我們多次提到了「cache miss」這個(gè)詞,利用「cache miss」來(lái)更好的保障DB和緩存之間的數(shù)據(jù)一致性。

然而,任何事物都是有兩面性的,「cache miss」在提供便利的同時(shí),也帶來(lái)了一個(gè)潛在風(fēng)險(xiǎn)。

這個(gè)風(fēng)險(xiǎn)就是「緩存雪崩」。

 

分布式系統(tǒng)「高性能」大招之——緩存背后的“毀滅種子”

 

在圖中的第二步,大量的請(qǐng)求并發(fā)進(jìn)入,這里的一次「cache miss」就有可能導(dǎo)致產(chǎn)生「緩存雪崩」。

不過(guò),雖然「cache miss」會(huì)產(chǎn)生「緩存雪崩」,但「緩存雪崩」并不僅僅產(chǎn)生于「cache miss」。

雪崩一詞源于「雪崩效應(yīng)」,是指像「多米勒骨牌」這樣的級(jí)聯(lián)反應(yīng)。前面沒(méi)頂住,導(dǎo)致影響后面,如此蔓延。(關(guān)于對(duì)應(yīng)雪崩的方式參考之前的文章,文末放鏈接)

所以「緩存雪崩」的根本問(wèn)題是:緩存由于某些原因未起到預(yù)期的緩沖效果,導(dǎo)致請(qǐng)求全部流轉(zhuǎn)到數(shù)據(jù)庫(kù),造成數(shù)據(jù)庫(kù)壓力過(guò)重。

因此,流量激增、高并發(fā)下的緩存過(guò)期、甚至緩存系統(tǒng)宕機(jī)都有可能產(chǎn)生「緩存雪崩」問(wèn)題。

怎么解決這個(gè)問(wèn)題呢?宕機(jī)可以通過(guò)做高可用來(lái)解決(可以參考之前的文章,文末放鏈接)。而在“流量激增”、“高并發(fā)下的緩存過(guò)期”這兩種場(chǎng)景下,也有兩種方式可以來(lái)解決。

加鎖排隊(duì)

通過(guò)加鎖或者排隊(duì)機(jī)制來(lái)限制讀數(shù)據(jù)庫(kù)寫(xiě)緩存的線程數(shù)量。比如,下面的偽代碼就是對(duì)某個(gè)key只允許一個(gè)線程進(jìn)入的效果。

  1. key = "aaa"; 
  2. ​ 
  3. var cacheValue = cache.read(key); 
  4. if (cacheValue != null) { 
  5.  return cacheValue; 
  6. else { 
  7.  lock(key) { 
  8.  cacheValue = cache.read(key); 
  9.  if (cacheValue != null) { 
  10.  return cacheValue; 
  11.  }  
  12.  else { 
  13.  cacheValue = db.read(key); 
  14.  cache.set(key,cacheValue); 
  15.  } 
  16.  } 
  17.  return cacheValue; 

這個(gè)比較好理解,就不廢話了。

緩存時(shí)間增加隨機(jī)值

這個(gè)主要針對(duì)的是「緩存定時(shí)過(guò)期」機(jī)制下的取巧方案。它的目的是避免多個(gè)緩存key在同一時(shí)間失效,導(dǎo)致壓力更加集中。

比如,你有10個(gè)key,他們的過(guò)期時(shí)間都是30分鐘的話,那么30分鐘后這10個(gè)key的所有請(qǐng)求會(huì)同時(shí)流到db去。

而這里說(shuō)的這種方式就是將這10個(gè)key的過(guò)期時(shí)間打亂,比如設(shè)置成25、26、27、...、34分的過(guò)期時(shí)間,這樣壓力就被分散了,每分鐘只有一個(gè)key過(guò)期。

最簡(jiǎn)單粗暴的方式就是在設(shè)置「過(guò)期時(shí)間」的時(shí)候加一個(gè)隨機(jī)數(shù)字。

cache.set(key,cacheValue,30+random())

總體來(lái)看,相比后者,前者的適用面更廣,所以Z哥建議你用「加鎖排隊(duì)」作為默認(rèn)的通用方案不失為一個(gè)不錯(cuò)的選擇。

「緩存穿透」、「緩存雪崩」傻傻分不清楚?

如果你聽(tīng)說(shuō)過(guò)「緩存穿透」的話,可能會(huì)問(wèn):「緩存雪崩」和「緩存穿透」一樣嗎?

從產(chǎn)生的效果上看是一樣的,但是過(guò)程不同。

來(lái)舉個(gè)例子。例子純屬虛構(gòu),別太在意合理性。

在一個(gè)方圓一萬(wàn)里的地區(qū)內(nèi),只有一個(gè)修手機(jī)的老師傅。他收了一個(gè)徒弟,希望徒弟能幫他分擔(dān)掉一部分的工作壓力。這里的老師傅可以看作是DB,徒弟看作是緩存。

老師傅對(duì)徒弟說(shuō),如果遇到你不會(huì)做的事你來(lái)請(qǐng)教我。

然后,一個(gè)客戶過(guò)來(lái)說(shuō)要修一下他的衛(wèi)星電話,徒弟去請(qǐng)教老師傅,老師傅說(shuō)他也不會(huì),先拒絕了吧。

但是由于沒(méi)告訴他后續(xù)遇到修衛(wèi)星電話的人該怎么做,所以后續(xù)這個(gè)客戶一直來(lái)問(wèn),徒弟每次都又去請(qǐng)教老師傅。最終,在修衛(wèi)星電話這件事上,徒弟并沒(méi)有幫老師傅緩解任何的壓力,快被煩死了。

上面這個(gè)故事就好比「緩存穿透」。

而「緩存雪崩」則是,由于徒弟年輕力壯,精力充沛,1小時(shí)能修20個(gè)手機(jī),老師傅只能修10個(gè)(但是手藝好,更考究)。

然后,有一天徒弟請(qǐng)假了,但恰巧這天來(lái)了2000個(gè)修手機(jī)的,老師傅修不過(guò)來(lái)就被累垮了。

所以,「緩存穿透」和「緩存雪崩」最終產(chǎn)生的效果是一樣的,就是因?yàn)榇罅空?qǐng)求流到DB后,把DB拖垮(正如前面故事中的老師傅)。

兩者最大的不同在于,「緩存雪崩」問(wèn)題只要數(shù)據(jù)從db中找到并放入緩存就能恢復(fù)正常(徒弟休假歸來(lái)),而「緩存穿透」指的是所需的數(shù)據(jù)在DB中一直不存在的情況(老師傅也不會(huì)修)。并且,由于DB中數(shù)據(jù)不存在,所以自然每次從緩存中也找不到(徒弟也不會(huì)修)。

清楚了兩者的區(qū)別之后,我們下面就來(lái)聊聊「緩存穿透」的常見(jiàn)應(yīng)對(duì)方式。

緩存穿透

「緩存穿透」有時(shí)也叫做「緩存擊穿」,產(chǎn)生的邏輯過(guò)程是這樣,一直在虛線范圍內(nèi)流轉(zhuǎn)。

 

分布式系統(tǒng)「高性能」大招之——緩存背后的“毀滅種子”

 

在這種場(chǎng)景下,緩存的作用完全失效,每次請(qǐng)求都“穿透”到了DB中。

可能你會(huì)想,為什么會(huì)存在大量的這種db中數(shù)據(jù)不存在的情況呢?其實(shí),任何依賴外部參數(shù)進(jìn)行查詢的地方都可能有這個(gè)問(wèn)題的存在。比如,一個(gè)文本輸入框,本來(lái)是讓你輸入用戶名的,但是手誤輸入了密碼,自然就找不到數(shù)據(jù)咯。更主要的問(wèn)題是,會(huì)有惡意分子利用這種機(jī)制來(lái)對(duì)你的系統(tǒng)進(jìn)行攻擊,擊穿緩存搞垮你的數(shù)據(jù)庫(kù),導(dǎo)致整個(gè)系統(tǒng)全面癱瘓。

同樣也有兩種方式來(lái)解決這個(gè)問(wèn)題。

布隆過(guò)濾器(bloomfilter)

布隆過(guò)濾器就是由一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)組成,將確定不存在的數(shù)據(jù)構(gòu)建到過(guò)濾器中,用它來(lái)過(guò)濾請(qǐng)求。這里就放個(gè)圖,具體就不展開(kāi)了,后續(xù)我們?cè)倭?有興趣的可以先到搜索引擎搜《Space time trade-offs in hash coding with allowable errors》找到bloom的原始論文)。

實(shí)現(xiàn)代碼其實(shí)并不很復(fù)雜,參考論文或者網(wǎng)上其他作者的一些實(shí)現(xiàn)就可以寫(xiě)出來(lái)。

不過(guò),布隆過(guò)濾器有一個(gè)最大的缺點(diǎn),也是其為了高效利用內(nèi)存而付出的代價(jià),就是無(wú)法確保100%的準(zhǔn)確率。

所以,如果你的場(chǎng)景要求是100%準(zhǔn)確的,就只能用下面這種方式了。

緩存空對(duì)象

其實(shí)就是哪怕從db中取出的數(shù)據(jù)是“空(null)”,也把它丟失到緩存中。

 

分布式系統(tǒng)「高性能」大招之——緩存背后的“毀滅種子”

 

這樣一來(lái),雖然緩存中存在著一個(gè)value為空的數(shù)據(jù),但是至少他能表示“數(shù)據(jù)庫(kù)里也沒(méi)有不用找了”。

其實(shí)這個(gè)思路和布隆過(guò)濾器有些類似,但是它對(duì)內(nèi)存的消耗會(huì)大很多,畢竟布隆過(guò)濾器是利用的bit位來(lái)存儲(chǔ)。不過(guò)這種方式的優(yōu)勢(shì)是前面提到的,不會(huì)出現(xiàn)誤差,而布隆過(guò)濾器的錯(cuò)誤率會(huì)隨著「位數(shù)」的增加而減少,會(huì)不斷趨近于0,但不會(huì)為0。

總結(jié)

好了,我們一起總結(jié)一下。

這次呢,Z哥主要和你聊了隱藏在緩存中的兩顆具有“毀滅性”的種子,「緩存雪崩」和「緩存穿透」,以及應(yīng)對(duì)這兩顆種子的常用方式。

而且,順便幫你區(qū)分清楚了「緩存雪崩」和「緩存穿透」的差異。

希望對(duì)你有所啟發(fā)。

 

分布式系統(tǒng)「高性能」大招之——緩存背后的“毀滅種子”

 

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2015-12-14 17:35:21

GemFire12306分布式

2021-07-06 10:35:46

分布式KafkaLinux

2022-04-07 17:13:09

緩存算法服務(wù)端

2011-09-14 10:08:07

Beanstalkd

2022-06-30 08:04:16

Redis分布式鎖Redisson

2018-12-14 10:06:22

緩存分布式系統(tǒng)

2012-12-28 17:31:06

2017-12-12 14:51:15

分布式緩存設(shè)計(jì)

2009-11-09 09:25:24

Memcached入門

2022-12-08 08:13:11

分布式數(shù)據(jù)庫(kù)CAP

2017-10-11 16:12:19

內(nèi)存

2023-05-12 08:23:03

分布式系統(tǒng)網(wǎng)絡(luò)

2023-05-05 06:13:51

分布式多級(jí)緩存系統(tǒng)

2013-04-19 11:03:32

memcahce入門教分布式緩存系統(tǒng)

2009-02-06 09:38:38

memcached分布式緩存系統(tǒng)ASP.NET

2023-02-11 00:04:17

分布式系統(tǒng)安全

2023-05-12 11:52:21

緩存場(chǎng)景性能

2023-04-27 09:00:35

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2019-09-12 08:50:37

Kafka分布式系統(tǒng)服務(wù)器
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 中文字幕 欧美 日韩 | 激情视频网站 | 国产精品五区 | 色在线看| 国产视频1区 | 亚洲一区免费 | 91精品国产91久久久久久最新 | 一级毛片免费视频 | 美女拍拍拍网站 | 亚洲第一在线 | 99在线免费观看视频 | 日韩在线大片 | 日韩无 | 婷婷综合 | www.五月天婷婷.com | 国产一区二区精品自拍 | 国产在线看片 | 五月婷婷视频 | 日韩av免费看 | 亚洲精品永久免费 | 久久久国产精品 | av中文字幕网 | 9久久精品 | 国产高清久久久 | 特一级毛片| 91视频电影 | 日韩欧美国产成人一区二区 | 日韩高清中文字幕 | 亚洲热在线视频 | 久热国产精品 | 在线观看中文字幕亚洲 | 色综合激情 | 免费黄篇| 伊人免费在线 | 国产视频第一页 | 自拍视频国产 | 欧美日韩亚洲国产综合 | 国产a视频 | 一级片免费视频 | 国产日韩欧美在线播放 | 久久伊人精品一区二区三区 |