chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

高并發(fā)系統(tǒng)中的緩存 緩存系統(tǒng)存在的三大問(wèn)題

西西 ? 來(lái)源:后端技術(shù)指南針 ? 作者:后端技術(shù)指南針 ? 2020-07-15 11:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.無(wú)處不在的緩存

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

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

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

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

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

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

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

對(duì)于一些基于LSM的存儲(chǔ)引擎數(shù)據(jù)庫(kù)來(lái)說(shuō),隨機(jī)寫(xiě)改為順序?qū)懰俣忍嵘艽螅请S機(jī)讀仍然是個(gè)問(wèn)題,所以緩存系統(tǒng)是很有必要的。

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

實(shí)際場(chǎng)景也是讀多寫(xiě)少,看看請(qǐng)求是如何得到響應(yīng)的,簡(jiǎn)單看下交互流程:

請(qǐng)求到達(dá)之后,業(yè)務(wù)線程首先訪問(wèn)緩存,如果緩存命中則返回

如果未命中則繼續(xù)請(qǐng)求磁盤(pán)數(shù)據(jù)庫(kù)系統(tǒng),獲取數(shù)據(jù)返回

從磁盤(pán)獲取數(shù)據(jù)后將結(jié)果回寫(xiě)到緩存系統(tǒng)且增加老化時(shí)間,為下次請(qǐng)求做準(zhǔn)備

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

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

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

緩存雪崩 Cache Avalanche

緩存穿透 Cache Penetration

緩存擊穿 Hotspot Invalid

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

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

3.1 緩存雪崩問(wèn)題

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

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

可見(jiàn)雪崩確實(shí)很可怕,回到高并發(fā)系統(tǒng),如果緩存系統(tǒng)故障,大量的請(qǐng)求無(wú)法從緩存完成數(shù)據(jù)請(qǐng)求,就全量洶涌沖向磁盤(pán)數(shù)據(jù)庫(kù)系統(tǒng),導(dǎo)致數(shù)據(jù)庫(kù)被打死,整個(gè)系統(tǒng)徹底崩潰。

3.2 緩存雪崩解決方案

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

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

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

3.3 緩存穿透問(wèn)題

穿透形象一點(diǎn)就是:請(qǐng)求過(guò)來(lái)了 轉(zhuǎn)了一圈 一無(wú)所獲 就像穿過(guò)透明地帶一樣。

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

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

舉個(gè)栗子:

拉面館的服務(wù)員和廚師不允許拒絕已經(jīng)進(jìn)來(lái)的消費(fèi)者,但是拉面館的經(jīng)營(yíng)范圍有限。此時(shí)惡意消費(fèi)者點(diǎn)了一只5斤的澳洲龍蝦,經(jīng)過(guò)服務(wù)員和廚師都無(wú)法響應(yīng)這個(gè)需求,此時(shí)輪流來(lái)了1000個(gè)這樣的惡意消費(fèi)者,拉面館基本要歇菜了。

3.4 緩存穿透解決方案

有效甄別是否存在這個(gè)key再?zèng)Q定是否讀取很重要,常見(jiàn)的做法有:

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

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

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

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

3.5 緩存擊穿問(wèn)題

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

由于緩存系統(tǒng)中的熱點(diǎn)數(shù)據(jù)都有過(guò)期時(shí)間,如果沒(méi)有過(guò)期時(shí)間就造成了主存和緩存的數(shù)據(jù)不一致,因此過(guò)期時(shí)間一般都不會(huì)太長(zhǎng)。

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

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

3.6 緩存擊穿解決方案

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

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

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

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

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

緩存擊穿的影響一般來(lái)說(shuō)并不會(huì)太大,或許在你的服務(wù)跑了很久之后你才意識(shí)到會(huì)有緩存擊穿問(wèn)題。

4.小結(jié)

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213687
  • 計(jì)算機(jī)系統(tǒng)

    關(guān)注

    0

    文章

    290

    瀏覽量

    24641
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    246

    瀏覽量

    27159
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    面試常問(wèn)的緩存問(wèn)題

    面試常問(wèn),緩存大問(wèn)題及解決方案!
    發(fā)表于 06-28 16:41

    基于FC-AL系統(tǒng)FPGA的彈性緩存方案設(shè)計(jì)

    采用本地晶振和鎖相環(huán)產(chǎn)生的時(shí)鐘Clk2,作為其工作時(shí)鐘源。接收機(jī)在時(shí)鐘Clk1的上升沿把數(shù)據(jù)寫(xiě)入彈性緩存,發(fā)送機(jī)在時(shí)鐘Clk2的上升沿從彈性緩存讀出數(shù)據(jù),從而實(shí)現(xiàn)數(shù)據(jù)的同步。雖然光纖通道仲裁環(huán)中
    發(fā)表于 07-05 08:23

    高速緩存/海量緩存的設(shè)計(jì)實(shí)現(xiàn)

    ?! 【C合考慮以上種高速緩存方案的性能、價(jià)格和實(shí)現(xiàn)方便性后,筆者選用第種方案(即高速SRAM切換方式)來(lái)構(gòu)成A/D采樣高速緩存系統(tǒng)的采
    發(fā)表于 12-04 15:59

    緩存的作用和設(shè)計(jì)模式

    (keyValueEntity.getId()));}return updateFlag ; }}Read-Throug模式當(dāng)應(yīng)用系統(tǒng)緩存系統(tǒng)請(qǐng)求數(shù)據(jù)時(shí),如果緩存
    發(fā)表于 01-05 17:57

    渲染的幀緩存和深度緩存

    渲染涉及大量的緩存,這里緩存只是一個(gè)簡(jiǎn)單的存有像素?cái)?shù)據(jù)的矩形內(nèi)存塊,最重要緩存是幀緩存和深度緩存
    的頭像 發(fā)表于 05-14 11:44 ?7198次閱讀
    渲染<b class='flag-5'>中</b>的幀<b class='flag-5'>緩存</b>和深度<b class='flag-5'>緩存</b>

    淺談架構(gòu)設(shè)計(jì)緩存技術(shù)

    緩存在架構(gòu)設(shè)計(jì)占有重要地位。緩存在提升性能也扮演重要的角色。常見(jiàn)的有對(duì)資源的緩存,比如數(shù)據(jù)庫(kù)連接池、http連接池,還有對(duì)數(shù)據(jù)的
    的頭像 發(fā)表于 01-01 10:18 ?3368次閱讀
    淺談架構(gòu)設(shè)計(jì)<b class='flag-5'>中</b>的<b class='flag-5'>緩存</b>技術(shù)

    緩存系統(tǒng)座大山

    基于機(jī)械磁盤(pán)或SSD的數(shù)據(jù)庫(kù)系統(tǒng),一般來(lái)說(shuō)讀寫(xiě)的速度遠(yuǎn)慢于內(nèi)存,因此單純磁盤(pán)介質(zhì)的數(shù)據(jù)庫(kù)無(wú)法支撐很高的并發(fā),可以簡(jiǎn)單認(rèn)為緩存是保護(hù)磁盤(pán)數(shù)據(jù)庫(kù)的重要屏障。
    的頭像 發(fā)表于 08-14 17:00 ?1832次閱讀
    <b class='flag-5'>緩存</b><b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>三</b>座大山

    Redis集群緩存方案,緩存常見(jiàn)問(wèn)題盤(pán)點(diǎn)

    如今,緩存系統(tǒng)的應(yīng)用非常廣泛,能夠用來(lái)提高并發(fā)數(shù)、數(shù)據(jù)吞吐量,提高快速響應(yīng)能力。那么當(dāng)數(shù)據(jù)量達(dá)到一定程度,單機(jī)環(huán)境可能就顯得有些力不從心了,就需要一個(gè)分布式緩存
    發(fā)表于 12-16 10:48 ?2368次閱讀
    Redis集群<b class='flag-5'>緩存</b>方案,<b class='flag-5'>緩存</b>常見(jiàn)問(wèn)題盤(pán)點(diǎn)

    如何設(shè)計(jì)一個(gè)緩存系統(tǒng)?

    設(shè)計(jì)一個(gè)緩存系統(tǒng),不得不要考慮的問(wèn)題就是:緩存穿透、緩存擊穿與失效時(shí)的雪崩效應(yīng)。 緩存穿透 緩存
    的頭像 發(fā)表于 02-08 11:40 ?3165次閱讀

    基于多級(jí)隊(duì)列的云服務(wù)并發(fā)量分級(jí)緩存機(jī)制

    基于多級(jí)隊(duì)列的云服務(wù)并發(fā)量分級(jí)緩存機(jī)制
    發(fā)表于 06-24 11:35 ?15次下載

    聊聊本地緩存和分布式緩存

    本地緩存 :應(yīng)用緩存組件,緩存組件和應(yīng)用在同一進(jìn)程緩存的讀寫(xiě)非???,沒(méi)有網(wǎng)絡(luò)開(kāi)銷(xiāo)。但各應(yīng)
    發(fā)表于 06-11 15:12 ?1068次閱讀
    聊聊本地<b class='flag-5'>緩存</b>和分布式<b class='flag-5'>緩存</b>

    如何使用緩存

    存放一個(gè)副本,當(dāng)該內(nèi)容下次被訪問(wèn)時(shí),不必連接到駐留網(wǎng)站,而是由Cache中保留的副本提供。 在企業(yè)Web應(yīng)用,通過(guò)緩存技術(shù)能夠提高請(qǐng)求的響應(yīng)速度;減少系統(tǒng)IO開(kāi)銷(xiāo);降低系統(tǒng)數(shù)據(jù)讀寫(xiě)壓
    的頭像 發(fā)表于 10-08 14:07 ?929次閱讀

    mybatis一級(jí)緩存和二級(jí)緩存的原理

    于SqlSession的生命周期中,當(dāng)SqlSession關(guān)閉時(shí),一級(jí)緩存也會(huì)被清空。 1.2 緩存實(shí)現(xiàn)機(jī)制 一級(jí)緩存采用了基于PerpetualCache的HashMap來(lái)實(shí)現(xiàn),使用一個(gè)Map對(duì)象來(lái)保存
    的頭像 發(fā)表于 12-03 11:55 ?1521次閱讀

    Redis緩存預(yù)熱+緩存雪崩+緩存擊穿+緩存穿透要點(diǎn)簡(jiǎn)析

    緩存預(yù)熱就是系統(tǒng)上線后,提前將相關(guān)的緩存數(shù)據(jù)直接加載到緩存系統(tǒng)
    的頭像 發(fā)表于 12-25 09:41 ?1157次閱讀
    Redis<b class='flag-5'>緩存</b>預(yù)熱+<b class='flag-5'>緩存</b>雪崩+<b class='flag-5'>緩存</b>擊穿+<b class='flag-5'>緩存</b>穿透要點(diǎn)簡(jiǎn)析

    高性能緩存設(shè)計(jì):如何解決緩存偽共享問(wèn)題

    在多核并發(fā)場(chǎng)景下, 緩存偽共享(False Sharing) 是導(dǎo)致性能驟降的“隱形殺手”。當(dāng)不同線程頻繁修改同一緩存行(Cache Line)
    的頭像 發(fā)表于 07-01 15:01 ?121次閱讀
    高性能<b class='flag-5'>緩存</b>設(shè)計(jì):如何解決<b class='flag-5'>緩存</b>偽共享問(wèn)題