圖解 | 什么是緩存系統(tǒng)三座大山

來自公眾號:后端技術(shù)指南針
作者:后端技術(shù)指南針

1.無處不在的緩存

緩存在計算機(jī)系統(tǒng)是無處不在财著,在CPU層面有L1-L3的Cache泥畅,在Linux中有TLB加速虛擬地址和物理地址的轉(zhuǎn)換,在瀏覽器有本地緩存缩赛、手機(jī)有本地緩存等。

image

可見,緩存在計算機(jī)系統(tǒng)中有非常重要的地位乖订,其主要作用是提高響應(yīng)速度、減少磁盤訪問等具练,本文主要討論在高并發(fā)系統(tǒng)中的緩存系統(tǒng)乍构。

一句話概括緩存系統(tǒng)在高并發(fā)系統(tǒng)中的地位的話:如果高并發(fā)系統(tǒng)是烤羊肉串,那么緩存系統(tǒng)就是那一撮孜然扛点。

image

2.高并發(fā)系統(tǒng)中的緩存

2.1 緩存系統(tǒng)的作用

緩存系統(tǒng)在高并發(fā)系統(tǒng)的作用很大哥遮,在某種程度上可以說沒有緩存系統(tǒng)很難支撐高并發(fā)場景。

基于機(jī)械磁盤或SSD的數(shù)據(jù)庫系統(tǒng)陵究,一般來說讀寫的速度遠(yuǎn)慢于內(nèi)存眠饮,因此單純磁盤介質(zhì)的數(shù)據(jù)庫無法支撐很高的并發(fā),可以簡單認(rèn)為緩存是保護(hù)磁盤數(shù)據(jù)庫的重要屏障铜邮。

對于一些基于LSM的存儲引擎數(shù)據(jù)庫來說仪召,隨機(jī)寫改為順序?qū)懰俣忍嵘艽螅请S機(jī)讀仍然是個問題松蒜,所以緩存系統(tǒng)是很有必要的扔茅。

image

2.2 緩存系統(tǒng)訪問流程

實(shí)際場景也是讀多寫少,看看請求是如何得到響應(yīng)的秸苗,簡單看下交互流程:

  • 請求到達(dá)之后召娜,業(yè)務(wù)線程首先訪問緩存,如果緩存命中則返回
  • 如果未命中則繼續(xù)請求磁盤數(shù)據(jù)庫系統(tǒng)难述,獲取數(shù)據(jù)返回
  • 從磁盤獲取數(shù)據(jù)后將結(jié)果回寫到緩存系統(tǒng)且增加老化時間萤晴,為下次請求做準(zhǔn)備
image

以上是高并發(fā)系統(tǒng)中緩存和磁盤數(shù)據(jù)庫系統(tǒng)、客戶端請求之間的交互過程胁后,后續(xù)的問題分析店读,也是基于此過程展開的。

3.緩存系統(tǒng)的三大問題

網(wǎng)絡(luò)上對于緩存三大問題的文章很多攀芯,提到的三個問題主要是:

  • 緩存雪崩 Cache Avalanche
  • 緩存穿透 Cache Penetration
  • 緩存擊穿 Hotspot Invalid

對于上面的三個名詞我一直分不清楚屯断,腦海中并沒有清晰的區(qū)別。

于是想到去谷歌看看歪果仁是怎么說的榜旦,然而英文表述就是上面的英文戏蔑,基本上和漢語翻譯是一樣的,所以只能強(qiáng)記省撑,太難了趴久。

image

3.1 緩存雪崩問題

所謂雪崩就是原來有所支撐的冰雪丸相,某一瞬間失去依托,瞬間涌下來彼棍。

這個場景讓我想起了2011年上映的柯南劇場版《沉默的十五分鐘》灭忠,柯南在北澤村水庫為了拯救村莊制造的雪崩:

image

可見雪崩確實(shí)很可怕,回到高并發(fā)系統(tǒng)座硕,如果緩存系統(tǒng)故障弛作,大量的請求無法從緩存完成數(shù)據(jù)請求,就全量洶涌沖向磁盤數(shù)據(jù)庫系統(tǒng)华匾,導(dǎo)致數(shù)據(jù)庫被打死映琳,整個系統(tǒng)徹底崩潰。

3.2 緩存雪崩解決方案

造成緩存雪崩的主要原因是緩存系統(tǒng)不夠高可用蜘拉,因此提高緩存系統(tǒng)的穩(wěn)定性和可用性十分必要萨西,比如對于使用Redis作為緩存的系統(tǒng)而言可以使用哨兵機(jī)制、集群化旭旭、持久化等來提高緩存系統(tǒng)的HA原杂。

除了保證緩存系統(tǒng)的HA之外,服務(wù)本身也需要支持降級您机,可以借助比如Hystrix來實(shí)現(xiàn)服務(wù)的熔斷穿肄、降級、限流來降低出現(xiàn)雪崩時的故障程度际看。

image

說白了就是別讓服務(wù)徹底死掉就行咸产,就像大雪封高速肯定不能通行了,堵車慢一些至少可以走仲闽。

3.3 緩存穿透問題

穿透形象一點(diǎn)就是:請求過來了 轉(zhuǎn)了一圈 一無所獲 就像穿過透明地帶一樣脑溢。

在高并發(fā)系統(tǒng)中緩存穿透,如果一個req需要請求的數(shù)據(jù)在緩存中沒有赖欣,這時業(yè)務(wù)線程就會訪問磁盤數(shù)據(jù)庫系統(tǒng)屑彻,然而磁盤數(shù)據(jù)庫也沒有這個數(shù)據(jù),無奈業(yè)務(wù)線程只能白白處理一圈顶吮。

image

如果某時段有大量惡意的不存在的key的集中請求社牲,那么服務(wù)將一直處理這些根本不存在的請求,導(dǎo)致正常請求無法被處理悴了,從而出現(xiàn)問題搏恤。

舉個栗子:
拉面館的服務(wù)員和廚師不允許拒絕已經(jīng)進(jìn)來的消費(fèi)者违寿,但是拉面館的經(jīng)營范圍有限。此時惡意消費(fèi)者點(diǎn)了一只5斤的澳洲龍蝦熟空,經(jīng)過服務(wù)員和廚師都無法響應(yīng)這個需求藤巢,此時輪流來了1000個這樣的惡意消費(fèi)者,拉面館基本要歇菜了息罗。

image

3.4 緩存穿透解決方案

有效甄別是否存在這個key再決定是否讀取很重要掂咒,常見的做法有:

  • 把不存在的key寫一下null,這樣再來就相當(dāng)于命中了迈喉,其實(shí)這種方法局限性很大俏扩,今天是5斤龍蝦,明天改成6斤的螃蟹弊添,緩存系統(tǒng)和數(shù)據(jù)庫中存儲大量無用key本身是無意義的,所以一般不建議

  • 另外一種思路捌木,轉(zhuǎn)換為查找問題油坝,類似于在海量數(shù)據(jù)中查找某個key是否存在,考慮空間復(fù)雜度和時間復(fù)雜度刨裆,一般選用布隆過濾器來實(shí)現(xiàn)澈圈。

布隆過濾器是個好東西,有非常多的用途帆啃,包括:垃圾郵件識別瞬女、搜索蜘蛛爬蟲url去重等,主要借助K個哈希函數(shù)和一個超大的bit數(shù)組來降低哈希沖突本身帶來的誤判努潘,從而提高識別準(zhǔn)確性诽偷。

布隆過濾器也存在一定的誤判,假如判斷存在可能不一定存在疯坤,但是假如判斷不存在就一定不存在报慕,因此剛好用在解決緩存穿透的key查找場景,事實(shí)上很多系統(tǒng)都是基于布隆過濾器來解決緩存穿透問題的压怠。

image

3.5 緩存擊穿問題

緩存擊穿是這樣一種情況:

由于緩存系統(tǒng)中的熱點(diǎn)數(shù)據(jù)都有過期時間眠冈,如果沒有過期時間就造成了主存和緩存的數(shù)據(jù)不一致,因此過期時間一般都不會太長菌瘫。

設(shè)想某時刻一批熱點(diǎn)數(shù)據(jù)同時在緩存系統(tǒng)中過期失效蜗顽,那么這部分?jǐn)?shù)據(jù)就都將請求磁盤數(shù)據(jù)庫系統(tǒng)

image

從描述上來看有點(diǎn)像微小規(guī)模的雪崩雨让,但是對數(shù)據(jù)庫的壓力就很小了雇盖,只不過會影響并發(fā)性能,然而在多線程場景中緩存擊穿卻是經(jīng)常發(fā)生的栖忠,相反緩存穿透和雪崩頻率不如緩存擊穿刊懈,因此研究擊穿的現(xiàn)實(shí)意義更大一些这弧。

image

3.6 緩存擊穿解決方案

可以采用的方案大概有幾種:

  • 在設(shè)置熱點(diǎn)數(shù)據(jù)過期時間時盡量分散,比如設(shè)置100ms的基礎(chǔ)值虚汛,在此基礎(chǔ)上正負(fù)浮動10ms匾浪,從而降低相同時刻出現(xiàn)CacheMiss的key的數(shù)量。

  • 另外一種做法是多線程加鎖卷哩,其中第一個線程發(fā)現(xiàn)CacheMiss之后進(jìn)行加鎖蛋辈,再從數(shù)據(jù)庫獲取內(nèi)容之后寫到緩存中,其他線程獲取鎖失敗則阻塞數(shù)ms之后再進(jìn)行緩存讀取将谊,這樣可以降低訪問數(shù)據(jù)數(shù)據(jù)庫的線程數(shù)冷溶,需要注意在單機(jī)和集群需要使用不同的鎖,集群環(huán)境使用分布式鎖來實(shí)現(xiàn)尊浓,但是由于鎖的存在也會影響并發(fā)效率逞频。

  • 一種方法是在業(yè)務(wù)層對使用的熱點(diǎn)數(shù)據(jù)查看是否即將過期,如果即將過期則去數(shù)據(jù)庫獲取最新數(shù)據(jù)進(jìn)行更新并延長該熱點(diǎn)key在緩存系統(tǒng)中的時間栋齿,從而避免后面的過期CacheMiss苗胀,相當(dāng)于把事情提前解決了。

緩存擊穿的解決方法都有一定的權(quán)衡瓦堵,實(shí)際中根據(jù)自己的需求來解決基协。

緩存擊穿的影響一般來說并不會太大,或許在你的服務(wù)跑了很久之后你才意識到會有緩存擊穿問題菇用。

4.小結(jié)

緩存系統(tǒng)無論在實(shí)際工作中還是在面試中都是熱點(diǎn)內(nèi)容澜驮,緩存系統(tǒng)目的是為了讓訪問又準(zhǔn)又快,不要一味追求緩存命中率惋鸥,緩存和主數(shù)據(jù)庫的數(shù)據(jù)一致性是需要重點(diǎn)考慮的杂穷。

總起來說,如何在保證數(shù)據(jù)正確性的前提下提高緩存命中率就是核心問題卦绣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亭畜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迎卤,更是在濱河造成了極大的恐慌拴鸵,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜗搔,死亡現(xiàn)場離奇詭異劲藐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)樟凄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門聘芜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缝龄,你說我怎么就攤上這事汰现」业” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵瞎饲,是天一觀的道長口叙。 經(jīng)常有香客問我,道長嗅战,這世上最難降的妖魔是什么妄田? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮驮捍,結(jié)果婚禮上疟呐,老公的妹妹穿的比我還像新娘。我一直安慰自己东且,他們只是感情好启具,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著珊泳,像睡著了一般鲁冯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旨椒,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音堵漱,去河邊找鬼综慎。 笑死,一個胖子當(dāng)著我的面吹牛勤庐,可吹牛的內(nèi)容都是我干的示惊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼愉镰,長吁一口氣:“原來是場噩夢啊……” “哼米罚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丈探,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤录择,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碗降,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘竭,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年讼渊,在試婚紗的時候發(fā)現(xiàn)自己被綠了动看。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡爪幻,死狀恐怖菱皆,靈堂內(nèi)的尸體忽然破棺而出须误,到底是詐尸還是另有隱情,我是刑警寧澤仇轻,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布京痢,位于F島的核電站,受9級特大地震影響拯田,放射性物質(zhì)發(fā)生泄漏历造。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一船庇、第九天 我趴在偏房一處隱蔽的房頂上張望吭产。 院中可真熱鬧,春花似錦鸭轮、人聲如沸臣淤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邑蒋。三九已至,卻和暖如春按厘,著一層夾襖步出監(jiān)牢的瞬間医吊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工逮京, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卿堂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓懒棉,卻偏偏與公主長得像草描,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子策严,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355