<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一張圖弄清楚緩存架構(gòu)設(shè)計(jì)中的經(jīng)典問(wèn)題及解決方案

          共 1965字,需瀏覽 4分鐘

           ·

          2024-03-25 20:00


          下面這張圖非常形象的描述了緩存設(shè)計(jì)中幾個(gè)容易混淆的概念:緩存擊穿、緩存穿透、緩存雪崩,并給出了相應(yīng)的解決方案。

          4481ec153bbb4167e3ed87eed0a03b89.webp


          Cache Penetration

          概述

          Cache penetration( 緩存穿透 ) : 緩存穿透是指大量請(qǐng)求查詢系統(tǒng)中不存在的數(shù)據(jù)通過(guò)不存在的 UID 訪問(wèn)用戶,既然這些數(shù)據(jù)在系統(tǒng)中不存在,那么肯定在Redis緩存中也不存在這批數(shù)據(jù),這樣導(dǎo)致這些請(qǐng)求都會(huì)穿透到DB,導(dǎo)致系統(tǒng)崩潰。有些同學(xué)可能就會(huì)問(wèn)了,既然系統(tǒng)中都沒(méi)這些數(shù)據(jù),為什么還會(huì)存在這樣的請(qǐng)求了?別忘了,這個(gè)世界上還有一群計(jì)算機(jī)破壞分子,他們可能基于各種目的,偽造這樣的請(qǐng)求去攻擊你的系統(tǒng)。

          解決方案

          方案一: 緩存不存在的key,即使key對(duì)應(yīng)的數(shù)據(jù)系統(tǒng)中不存在,也將該key緩存下,只不過(guò) 這個(gè)  key 對(duì)應(yīng)的  value 是一個(gè) 特殊設(shè)置的值。這樣即使訪問(wèn)不存在的key時(shí)也會(huì)命中緩存返回,不會(huì)再去DB中獲取了。

          該方案缺陷:如果訪問(wèn)的是大量不存在的key,很顯然,為了緩存這些系統(tǒng)中不存的key,會(huì)占用大量的緩存空間,而我們知道緩存空間是有限的,無(wú)效key占用的空間多了,勢(shì)必會(huì)將一些正常的key淘汰掉,這樣就導(dǎo)致緩存命中率下降

          方案二: 構(gòu)建一個(gè) BloomFilter 過(guò)濾器,記錄全量數(shù)據(jù),這樣訪問(wèn)數(shù)據(jù)時(shí),可以直接通過(guò) BloomFilter 判斷這個(gè)key 是否存在,如果不存在直接返回即可(BloomFilter特性:如果判斷不存在則一定不存在),根本無(wú)需查緩存和 DB。

          該方案缺陷:BloomFilter 要緩存全量的 key,這就要求全量的 key數(shù)量不能太大,30億條數(shù)據(jù)以內(nèi)最佳(30億條數(shù)據(jù)大約會(huì)占5GB左右)。

          Cache Breakdown

          概述

          Cache Breakdown( 緩存擊穿 ):緩存擊穿是指一個(gè) 熱門緩存key突然失效 ,導(dǎo)致大量請(qǐng)求直接訪問(wèn)到DB,導(dǎo)致系統(tǒng)崩潰。與后面描述的緩存雪崩不同的是,緩存擊穿通常是某個(gè)特定的緩存鍵失效。 可以這樣說(shuō):緩存擊穿是某個(gè)或者少數(shù)幾個(gè)key的行為,而緩存雪崩則是一群key的狂歡。

          解決方案

          方案: 對(duì)于一個(gè)緩存系統(tǒng)來(lái)說(shuō),熱門key畢竟是少數(shù),因此 解決方法也比較直接,對(duì)于訪問(wèn)特別頻繁的熱點(diǎn)數(shù)據(jù),我們干脆就 不設(shè)置過(guò)期時(shí)間 了。這樣一來(lái),對(duì)熱點(diǎn)數(shù)據(jù)的訪問(wèn)請(qǐng)求,都可以在緩存中進(jìn)行處理,

          Cache Crash

          概述

          Cache Crash(緩存雪崩): 緩存雪崩是指 緩存中的大量數(shù)據(jù)同時(shí)失效或者同時(shí)被刪除 ,導(dǎo)致大量請(qǐng)求穿透到DB,造成系統(tǒng)崩潰。造成緩存中的大量數(shù)據(jù)同時(shí)失效或者同時(shí)被刪除的原因主要有: 1、緩存服務(wù)器宕機(jī)  。

          2: 緩存數(shù)據(jù)的過(guò)期時(shí)間設(shè)置不合理,導(dǎo)致大量數(shù)據(jù)在同一時(shí)間失效(對(duì)應(yīng)圖中Thunder Hurd Problem)。

          解決方案

          方案一: 避免給大量的數(shù)據(jù)設(shè)置相同的過(guò)期時(shí)間 。如果業(yè)務(wù)層的確要求有些數(shù)據(jù)同時(shí)失效,你可以在用 EXPIRE 命令給每個(gè)數(shù)據(jù)設(shè)置過(guò)期時(shí)間時(shí),給這些數(shù)據(jù)的過(guò)期時(shí)間增加一個(gè)較小的隨機(jī)數(shù),這樣一來(lái),不同數(shù)據(jù)的過(guò)期時(shí)間有所差別,但差別又不會(huì)太大,既避免了大量數(shù)據(jù)同時(shí)過(guò)期,同時(shí)也保證了這些數(shù)據(jù)基本在相近的時(shí)間失效,仍然能滿足業(yè)務(wù)需求。

          方案二: 對(duì)于非核心業(yè)務(wù),通過(guò)服務(wù)降級(jí),來(lái)應(yīng)對(duì)緩存雪崩。如對(duì)業(yè)務(wù) DB 的訪問(wèn)增加讀寫開關(guān),當(dāng)發(fā)現(xiàn) DB 請(qǐng)求變慢、阻塞,慢請(qǐng)求超過(guò)閥值時(shí),就會(huì)關(guān)閉讀開關(guān),不允許再訪問(wèn)數(shù)據(jù)庫(kù),直接返回預(yù)定義信息、空值或是錯(cuò)誤信息;這樣一來(lái),只有部分過(guò)期數(shù)據(jù)的請(qǐng)求會(huì)發(fā)送到數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)的壓力就沒(méi)有那么大了。

          方案三: 緩存集群高可用部署,同時(shí)對(duì)緩存集群 進(jìn)行實(shí)時(shí)監(jiān)控,盡量做到緩存服務(wù)器少宕機(jī)或者宕機(jī)之后可以及時(shí)迅續(xù)恢復(fù)。

          實(shí)際生產(chǎn)項(xiàng)目中,上述三種方案是同時(shí)并存,這樣才能最大程度的保護(hù)系統(tǒng)。

          推薦閱讀:

          完全整理 | 365篇高質(zhì)技術(shù)文章目錄整理

          算法之美 : 棧和隊(duì)列

          主宰這個(gè)世界的10大算法

          徹底理解cookie、session、token

          淺談什么是遞歸算法

          專注服務(wù)器后臺(tái)技術(shù)棧知識(shí)總結(jié)分享

          歡迎關(guān)注交流共同進(jìn)步

          碼農(nóng)有道  coding


          碼農(nóng)有道,為您提供通俗易懂的技術(shù)文章,讓技術(shù)變更簡(jiǎn)單!

          瀏覽 66
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人看操美女 | 99视频在线观看国产 | 亚洲中文第一字幕 | 乱色AV| 大香蕉伊看人在线在线观看 |