吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

高并發系統中的緩存 緩存系統存在的三大問題

西西 ? 來源:后端技術指南針 ? 作者:后端技術指南針 ? 2020-07-15 11:03 ? 次閱讀

1.無處不在的緩存

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

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

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

2.高并發系統中的緩存

2.1 緩存系統的作用

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

基于機械磁盤或SSD的數據庫系統,一般來說讀寫的速度遠慢于內存,因此單純磁盤介質的數據庫無法支撐很高的并發,可以簡單認為緩存是保護磁盤數據庫的重要屏障。

對于一些基于LSM的存儲引擎數據庫來說,隨機寫改為順序寫速度提升很大,但是隨機讀仍然是個問題,所以緩存系統是很有必要的。

2.2 緩存系統訪問流程

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

請求到達之后,業務線程首先訪問緩存,如果緩存命中則返回

如果未命中則繼續請求磁盤數據庫系統,獲取數據返回

從磁盤獲取數據后將結果回寫到緩存系統且增加老化時間,為下次請求做準備

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

3.緩存系統的三大問題

網絡上對于緩存三大問題的文章很多,提到的三個問題主要是:

緩存雪崩 Cache Avalanche

緩存穿透 Cache Penetration

緩存擊穿 Hotspot Invalid

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

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

3.1 緩存雪崩問題

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

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

可見雪崩確實很可怕,回到高并發系統,如果緩存系統故障,大量的請求無法從緩存完成數據請求,就全量洶涌沖向磁盤數據庫系統,導致數據庫被打死,整個系統徹底崩潰。

3.2 緩存雪崩解決方案

造成緩存雪崩的主要原因是緩存系統不夠高可用,因此提高緩存系統的穩定性和可用性十分必要,比如對于使用Redis作為緩存的系統而言可以使用哨兵機制、集群化、持久化等來提高緩存系統的HA。

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

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

3.3 緩存穿透問題

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

在高并發系統中緩存穿透,如果一個req需要請求的數據在緩存中沒有,這時業務線程就會訪問磁盤數據庫系統,然而磁盤數據庫也沒有這個數據,無奈業務線程只能白白處理一圈。

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

舉個栗子:

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

3.4 緩存穿透解決方案

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

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

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

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

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

3.5 緩存擊穿問題

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

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

設想某時刻一批熱點數據同時在緩存系統中過期失效,那么這部分數據就都將請求磁盤數據庫系統。

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

3.6 緩存擊穿解決方案

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

在設置熱點數據過期時間時盡量分散,比如設置100ms的基礎值,在此基礎上正負浮動10ms,從而降低相同時刻出現CacheMiss的key的數量。

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

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

緩存擊穿的解決方法都有一定的權衡,實際中根據自己的需求來解決。

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

4.小結

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210391
  • 計算機系統
    +關注

    關注

    0

    文章

    289

    瀏覽量

    24211
  • 緩存
    +關注

    關注

    1

    文章

    241

    瀏覽量

    26757
收藏 人收藏

    評論

    相關推薦

    面試常問的緩存問題

    面試常問,緩存大問題及解決方案!
    發表于 06-28 16:41

    基于FC-AL系統FPGA的彈性緩存方案設計

    采用本地晶振和鎖相環產生的時鐘Clk2,作為其工作時鐘源。接收機在時鐘Clk1的上升沿把數據寫入彈性緩存,發送機在時鐘Clk2的上升沿從彈性緩存讀出數據,從而實現數據的同步。雖然光纖通道仲裁環中
    發表于 07-05 08:23

    高速緩存/海量緩存的設計實現

    。  綜合考慮以上種高速緩存方案的性能、價格和實現方便性后,筆者選用第種方案(即高速SRAM切換方式)來構成A/D采樣高速緩存系統的采
    發表于 12-04 15:59

    緩存的作用和設計模式

    (keyValueEntity.getId()));}return updateFlag ; }}Read-Throug模式當應用系統緩存系統請求數據時,如果緩存
    發表于 01-05 17:57

    聊聊環形緩存在單片機程序的使用

    片頭因為環形緩存在單片機程序的使用是非常有效的,非常有用的,關于這個話題在此專門開一文章來聊聊這個話題。環形緩存的用途主要是來緩存數據,而需要緩存
    發表于 12-06 08:29

    渲染的幀緩存和深度緩存

    渲染涉及大量的緩存,這里緩存只是一個簡單的存有像素數據的矩形內存塊,最重要緩存是幀緩存和深度緩存
    的頭像 發表于 05-14 11:44 ?6452次閱讀
    渲染<b class='flag-5'>中</b>的幀<b class='flag-5'>緩存</b>和深度<b class='flag-5'>緩存</b>

    淺談架構設計緩存技術

    緩存在架構設計占有重要地位。緩存在提升性能也扮演重要的角色。常見的有對資源的緩存,比如數據庫連接池、http連接池,還有對數據的
    的頭像 發表于 01-01 10:18 ?2762次閱讀
    淺談架構設計<b class='flag-5'>中</b>的<b class='flag-5'>緩存</b>技術

    緩存系統座大山

    基于機械磁盤或SSD的數據庫系統,一般來說讀寫的速度遠慢于內存,因此單純磁盤介質的數據庫無法支撐很高的并發,可以簡單認為緩存是保護磁盤數據庫的重要屏障。
    的頭像 發表于 08-14 17:00 ?1719次閱讀
    <b class='flag-5'>緩存</b><b class='flag-5'>系統</b>的<b class='flag-5'>三</b>座大山

    Redis集群緩存方案,緩存常見問題盤點

    如今,緩存系統的應用非常廣泛,能夠用來提高并發數、數據吞吐量,提高快速響應能力。那么當數據量達到一定程度,單機環境可能就顯得有些力不從心了,就需要一個分布式緩存
    發表于 12-16 10:48 ?2295次閱讀
    Redis集群<b class='flag-5'>緩存</b>方案,<b class='flag-5'>緩存</b>常見問題盤點

    如何設計一個緩存系統

    設計一個緩存系統,不得不要考慮的問題就是:緩存穿透、緩存擊穿與失效時的雪崩效應。 緩存穿透 緩存
    的頭像 發表于 02-08 11:40 ?2986次閱讀

    基于多級隊列的云服務并發量分級緩存機制

    基于多級隊列的云服務并發量分級緩存機制
    發表于 06-24 11:35 ?15次下載

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

    本地緩存 :應用緩存組件,緩存組件和應用在同一進程緩存的讀寫非常快,沒有網絡開銷。但各應
    發表于 06-11 15:12 ?856次閱讀
    聊聊本地<b class='flag-5'>緩存</b>和分布式<b class='flag-5'>緩存</b>

    如何使用緩存

    存放一個副本,當該內容下次被訪問時,不必連接到駐留網站,而是由Cache中保留的副本提供。 在企業Web應用,通過緩存技術能夠提高請求的響應速度;減少系統IO開銷;降低系統數據讀寫壓
    的頭像 發表于 10-08 14:07 ?701次閱讀

    mybatis一級緩存和二級緩存的原理

    于SqlSession的生命周期中,當SqlSession關閉時,一級緩存也會被清空。 1.2 緩存實現機制 一級緩存采用了基于PerpetualCache的HashMap來實現,使用一個Map對象來保存
    的頭像 發表于 12-03 11:55 ?1240次閱讀

    Redis緩存預熱+緩存雪崩+緩存擊穿+緩存穿透要點簡析

    緩存預熱就是系統上線后,提前將相關的緩存數據直接加載到緩存系統
    的頭像 發表于 12-25 09:41 ?945次閱讀
    Redis<b class='flag-5'>緩存</b>預熱+<b class='flag-5'>緩存</b>雪崩+<b class='flag-5'>緩存</b>擊穿+<b class='flag-5'>緩存</b>穿透要點簡析
    玩百家乐官网技巧看路| 威尼斯人娱乐城 2013十一月九问好 | 累积式百家乐的玩法技巧和规则| 澳门百家乐新濠天地| 百家乐庄闲局部失| 威尼斯人娱乐城会员注册| 圣保罗百家乐的玩法技巧和规则| 威尼斯人娱乐城线上博彩| 顶级赌场官方下载| 石家庄市| 百家乐官网游戏机分析仪| 百家乐官网必知技巧| 大西洋百家乐官网的玩法技巧和规则| 百家乐单双打法| 威尼斯人娱乐场注册| 六合彩图库| 百家乐官网视频二人麻将| 丽都百家乐官网的玩法技巧和规则| 棋牌百家乐怎么玩| 香港百家乐赌城| 本溪亿酷棋牌下载| 百家乐官网在线投注网| 澳门百家乐21点| 大发888优惠代码| 娱乐城百家乐官网可以代理吗 | 百家乐官网里靴是什么意识| 风水24龙| 博E百百家乐的玩法技巧和规则| 包赢百家乐的玩法技巧和规则| 利高国际网上娱乐| 太阳城百家乐筹码租| 大发百家乐现金网| 德州扑克荷官| 百家乐官网网上娱乐场开户注册| 东莞百家乐的玩法技巧和规则 | 真人百家乐官网做假| 百家乐二代理解| 皇冠足球比分| 属猪属蛇做生意怎么样| 高尔夫百家乐的玩法技巧和规则| 百家乐官网技术交流群|