1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 2954字,需瀏覽 6分鐘

         ·

        2020-07-20 05:16

        點擊上方藍色“后端技術(shù)學(xué)堂”關(guān)注后加個“星標

        最新分享第一時間看!

        1.無處不在的緩存

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

        fe48b1ddafa20ee0cf28a2015bb2324b.webp

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

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

        b7d50b4600f7a85342c87e38539457db.webp

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

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

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

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

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

        e978b0bc6b9fe9ae59c767a90d138091.webp

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

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

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

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

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

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

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

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

        于是想到去谷歌看看歪果仁是怎么說的,然而英文表述就是上面的英文,基本上和漢語翻譯是一樣的,所以只能強記,太難了。

        adaa023891738436ae3030ca7bb81d9c.webp

        3.1 緩存雪崩問題

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

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

        82862e5311315e24c8512570b9da7289.webp

        可見雪崩確實很可怕,回到高并發(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)而言可以使用哨兵機制、集群化、持久化等來提高緩存系統(tǒng)的HA。

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

        2f72b186a64b5530b119c12927741e85.webp

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

        3.3 緩存穿透問題

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

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

        d53241e5cb36925691bff1d770cb3180.webp

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

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

        ad8455a64a467e3c6d013378f8260fa0.webp

        3.4 緩存穿透解決方案

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

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

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

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

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

        a5f0adf8383f0a0bea2c56be91ec8589.webp

        3.5 緩存擊穿問題

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

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

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

        da7991976ae5bae09489b4e9e18aa7a0.webp

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

        c8beae06055e00b973bdb206abbfd5d2.webp

        3.6 緩存擊穿解決方案

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

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

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

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

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

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

        4.小結(jié)

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

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

        17ad3e0cc2c0c6c1549ca44a1915f6c9.webp


        如果覺得文章寫的還行,對你有所幫助,請不吝三連「在看、點贊、分享」,這是對我持續(xù)創(chuàng)作的最大支持。

        今天的技術(shù)分享就到這里,我們下期再見。

        精選好文

        別再說你不懂Linux內(nèi)存管理了,10張圖給你安排的明明白白!

        面試都在問的微服務(wù),一文帶你徹底搞懂!

        面試官:你說對MySQL事務(wù)很熟?那我問你10個問題

        手把手教你配置VS Code遠程開發(fā)工具,工作效率提升N倍

        帶你學(xué)夠浪:Go基礎(chǔ)系列-環(huán)境配置和 Hello world

        關(guān)注公眾號「后端技術(shù)學(xué)堂」

        帶你一起學(xué)編程

        回復(fù)「資源」送你編程學(xué)習(xí)大禮包

        包括3個G的編程「學(xué)習(xí)資源」


        我建了個學(xué)習(xí)交流群,群內(nèi)不定期分享優(yōu)質(zhì)技術(shù)文章,一起學(xué)習(xí)一起進階,加下面我微信備注「進群」我拉你加入

        掃一掃,備注「進群

        學(xué)會了嗎?在看分享了嗎6d31397b908d0caa860df5ccefbb7573.webp



        瀏覽 22
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            男女啊啊啊网站 | 18秘 做爰免费视频网站 | 大鸡巴操大逼 | www.我要天天日女人.com | 国产婬乱一级毛片视频 | 天堂一区二区 | 爱搞视频在线 | 男女内射乱轮视频网站免费观看 | 不知火舞扒开胸罩给男生动漫 | 俺来也俺也射 |