欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁(yè) > 知識(shí)庫(kù) > 詳解緩存穿透擊穿雪崩解決方案

詳解緩存穿透擊穿雪崩解決方案

熱門(mén)標(biāo)簽:魔獸2青云地圖標(biāo)注 鄭州人工智能電銷(xiāo)機(jī)器人系統(tǒng) 超呼電話(huà)機(jī)器人 十堰營(yíng)銷(xiāo)電銷(xiāo)機(jī)器人哪家便宜 貴州電銷(xiāo)卡外呼系統(tǒng) 北京400電話(huà)辦理收費(fèi)標(biāo)準(zhǔn) 山東外呼銷(xiāo)售系統(tǒng)招商 宿遷便宜外呼系統(tǒng)平臺(tái) 日本中國(guó)地圖標(biāo)注

一:前言

設(shè)計(jì)一個(gè)緩存系統(tǒng),不得不要考慮的問(wèn)題就是:緩存穿透、緩存擊穿與失效時(shí)的雪崩效應(yīng)。

二:緩存穿透

緩存穿透是指查詢(xún)一個(gè)一定不存在的數(shù)據(jù),由于緩存是不命中時(shí)被動(dòng)寫(xiě)的,并且出于容錯(cuò)考慮,如果從存儲(chǔ)層查不到數(shù)據(jù)則不寫(xiě)入緩存,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到存儲(chǔ)層去查詢(xún),失去了緩存的意義。在流量大時(shí),可能DB就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應(yīng)用,這就是漏洞。

三:解決方案

有很多種方法可以有效地解決緩存穿透問(wèn)題,最常見(jiàn)的則是采用布隆過(guò)濾器,將所有可能存在的數(shù)據(jù)哈希到一個(gè)足夠大的bitmap中,一個(gè)一定不存在的數(shù)據(jù)會(huì)被 這個(gè)bitmap攔截掉,從而避免了對(duì)底層存儲(chǔ)系統(tǒng)的查詢(xún)壓力。另外也有一個(gè)更為簡(jiǎn)單粗暴的方法(我們采用的就是這種),如果一個(gè)查詢(xún)返回的數(shù)據(jù)為空(不管是數(shù) 據(jù)不存在,還是系統(tǒng)故障),我們?nèi)匀话堰@個(gè)空結(jié)果進(jìn)行緩存,但它的過(guò)期時(shí)間會(huì)很短,最長(zhǎng)不超過(guò)五分鐘。

四:緩存雪崩

緩存雪崩是指在我們?cè)O(shè)置緩存時(shí)采用了相同的過(guò)期時(shí)間,導(dǎo)致緩存在某一時(shí)刻同時(shí)失效,請(qǐng)求全部轉(zhuǎn)發(fā)到DB,DB瞬時(shí)壓力過(guò)重雪崩。

五:解決方案

緩存失效時(shí)的雪崩效應(yīng)對(duì)底層系統(tǒng)的沖擊非??膳隆4蠖鄶?shù)系統(tǒng)設(shè)計(jì)者考慮用加鎖或者隊(duì)列的方式保證緩存的單線(xiàn) 程(進(jìn)程)寫(xiě),從而避免失效時(shí)大量的并發(fā)請(qǐng)求落到底層存儲(chǔ)系統(tǒng)上。這里分享一個(gè)簡(jiǎn)單方案就時(shí)講緩存失效時(shí)間分散開(kāi),比如我們可以在原有的失效時(shí)間基礎(chǔ)上增加一個(gè)隨機(jī)值,比如1-5分鐘隨機(jī),這樣每一個(gè)緩存的過(guò)期時(shí)間的重復(fù)率就會(huì)降低,就很難引發(fā)集體失效的事件。

六:緩存擊穿

對(duì)于一些設(shè)置了過(guò)期時(shí)間的key,如果這些key可能會(huì)在某些時(shí)間點(diǎn)被超高并發(fā)地訪(fǎng)問(wèn),是一種非?!盁狳c(diǎn)”的數(shù)據(jù)。這個(gè)時(shí)候,需要考慮一個(gè)問(wèn)題:緩存被“擊穿”的問(wèn)題,這個(gè)和緩存雪崩的區(qū)別在于這里針對(duì)某一key緩存,前者則是很多key。

緩存在某個(gè)時(shí)間點(diǎn)過(guò)期的時(shí)候,恰好在這個(gè)時(shí)間點(diǎn)對(duì)這個(gè)Key有大量的并發(fā)請(qǐng)求過(guò)來(lái),這些請(qǐng)求發(fā)現(xiàn)緩存過(guò)期一般都會(huì)從后端DB加載數(shù)據(jù)并回設(shè)到緩存,這個(gè)時(shí)候大并發(fā)的請(qǐng)求可能會(huì)瞬間把后端DB壓垮。

七:解決方案

1、使用互斥鎖(mutex key)

業(yè)界比較常用的做法,是使用mutex。簡(jiǎn)單地來(lái)說(shuō),就是在緩存失效的時(shí)候(判斷拿出來(lái)的值為空),不是立即去load db,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者M(jìn)emcache的ADD)去set一個(gè)mutex key,當(dāng)操作返回成功時(shí),再進(jìn)行l(wèi)oad db的操作并回設(shè)緩存;否則,就重試整個(gè)get緩存的方法。

SETNX,是「SET if Not eXists」的縮寫(xiě),也就是只有不存在的時(shí)候才設(shè)置,可以利用它來(lái)實(shí)現(xiàn)鎖的效果。在redis2.6.1之前版本未實(shí)現(xiàn)setnx的過(guò)期時(shí)間,所以這里給出兩種版本代碼參考:

//2.6.1前單機(jī)版本鎖
String get(String key) {
   String value = redis.get(key);
   if (value  == null) {
    if (redis.setnx(key_mutex, "1")) {
        // 3 min timeout to avoid mutex holder crash
        redis.expire(key_mutex, 3 * 60)
        value = db.get(key);
        redis.set(key, value);
        redis.delete(key_mutex);
    } else {
        //其他線(xiàn)程休息50毫秒后重試
        Thread.sleep(50);
        get(key);
    }
  }
}

最新版本代碼:

public String get(key) {
      String value = redis.get(key);
      if (value == null) { //代表緩存值過(guò)期
          //設(shè)置3min的超時(shí),防止del操作失敗的時(shí)候,下次緩存過(guò)期一直不能load db
          if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表設(shè)置成功
               value = db.get(key);
                      redis.set(key, value, expire_secs);
                      redis.del(key_mutex);
              } else {  //這個(gè)時(shí)候代表同時(shí)候的其他線(xiàn)程已經(jīng)load db并回設(shè)到緩存了,這時(shí)候重試獲取緩存值即可
                      sleep(50);
                      get(key);  //重試
              }
          } else {
              return value;
          }
 }

memcache代碼

if (memcache.get(key) == null) {
    // 3 min timeout to avoid mutex holder crash
    if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {
        value = db.get(key);
        memcache.set(key, value);
        memcache.delete(key_mutex);
    } else {
        sleep(50);
        retry();
    }
}

2、"提前"使用互斥鎖(mutex key)

在value內(nèi)部設(shè)置1個(gè)超時(shí)值(timeout1), timeout1比實(shí)際的memcache timeout(timeout2)小。當(dāng)從cache讀取到timeout1發(fā)現(xiàn)它已經(jīng)過(guò)期時(shí)候,馬上延長(zhǎng)timeout1并重新設(shè)置到cache。然后再?gòu)臄?shù)據(jù)庫(kù)加載數(shù)據(jù)并設(shè)置到cache中。偽代碼如下:

v = memcache.get(key);
if (v == null) {
    if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {
        value = db.get(key);
        memcache.set(key, value);
        memcache.delete(key_mutex);
    } else {
        sleep(50);
        retry();
    }
} else {
    if (v.timeout = now()) {
        if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {
            // extend the timeout for other threads
            v.timeout += 3 * 60 * 1000;
            memcache.set(key, v, KEY_TIMEOUT * 2);

            // load the latest value from db
            v = db.get(key);
            v.timeout = KEY_TIMEOUT;
            memcache.set(key, value, KEY_TIMEOUT * 2);
            memcache.delete(key_mutex);
        } else {
            sleep(50);
            retry();
        }
    }
}

3、"永遠(yuǎn)不過(guò)期"

這里的“永遠(yuǎn)不過(guò)期”包含兩層意思:

(1) 從redis上看,確實(shí)沒(méi)有設(shè)置過(guò)期時(shí)間,這就保證了,不會(huì)出現(xiàn)熱點(diǎn)key過(guò)期問(wèn)題,也就是“物理”不過(guò)期。

(2) 從功能上看,如果不過(guò)期,那不就成靜態(tài)的了嗎?所以我們把過(guò)期時(shí)間存在key對(duì)應(yīng)的value里,如果發(fā)現(xiàn)要過(guò)期了,通過(guò)一個(gè)后臺(tái)的異步線(xiàn)程進(jìn)行緩存的構(gòu)建,也就是“邏輯”過(guò)期

從實(shí)戰(zhàn)看,這種方法對(duì)于性能非常友好,唯一不足的就是構(gòu)建緩存時(shí)候,其余線(xiàn)程(非構(gòu)建緩存的線(xiàn)程)可能訪(fǎng)問(wèn)的是老數(shù)據(jù),但是對(duì)于一般的互聯(lián)網(wǎng)功能來(lái)說(shuō)這個(gè)還是可以忍受。

String get(final String key) {
        V v = redis.get(key);
        String value = v.getValue();
        long timeout = v.getTimeout();
        if (v.timeout = System.currentTimeMillis()) {
            // 異步更新后臺(tái)異常執(zhí)行
            threadPool.execute(new Runnable() {
                public void run() {
                    String keyMutex = "mutex:" + key;
                    if (redis.setnx(keyMutex, "1")) {
                        // 3 min timeout to avoid mutex holder crash
                        redis.expire(keyMutex, 3 * 60);
                        String dbValue = db.get(key);
                        redis.set(key, dbValue);
                        redis.delete(keyMutex);
                    }
                }
            });
        }
        return value;
}

4、資源保護(hù)

采用netflix的hystrix,可以做資源的隔離保護(hù)主線(xiàn)程池,如果把這個(gè)應(yīng)用到緩存的構(gòu)建也未嘗不可。

四種解決方案:沒(méi)有最佳只有最合適

八:總結(jié)

針對(duì)業(yè)務(wù)系統(tǒng),永遠(yuǎn)都是具體情況具體分析,沒(méi)有最好,只有最合適。最后,對(duì)于緩存系統(tǒng)常見(jiàn)的緩存滿(mǎn)了和數(shù)據(jù)丟失問(wèn)題,需要根據(jù)具體業(yè)務(wù)分析,通常我們采用LRU策略處理溢出,Redis的RDB和AOF持久化策略來(lái)保證一定情況下的數(shù)據(jù)安全。

以上就是詳解緩存穿透擊穿雪崩解決方案的詳細(xì)內(nèi)容,更多關(guān)于緩存穿透擊穿雪崩解決方案的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 詳解緩存穿透/擊穿/雪崩原理及其解決方案

標(biāo)簽:北京 江蘇 果洛 臺(tái)州 朝陽(yáng) 楊凌 大慶 吉安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解緩存穿透擊穿雪崩解決方案》,本文關(guān)鍵詞  詳解,緩存,穿透,擊穿,雪崩,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解緩存穿透擊穿雪崩解決方案》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于詳解緩存穿透擊穿雪崩解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    成人高清av在线| 91麻豆精品久久毛片一级| 在线观看视频一区二区| 国产精品不卡一区二区三区| 国产精品69久久久久水密桃| 国产又粗又黄又猛| 久久久久国产精品人| 国产最新精品精品你懂的| 免费在线观看a视频| 久久―日本道色综合久久| 久久国产尿小便嘘嘘| 蜜桃传媒一区二区亚洲| 久久久久国产精品厨房| 国产精品亚洲第一区在线暖暖韩国| xxxxx99| 国产亚洲视频系列| 国产成人精品一区二| 国产精品久久久精品四季影院| 中文字幕一区二区在线播放| 99综合电影在线视频| 欧美熟乱第一页| 午夜久久久影院| 亚洲精品在线视频免费观看| 欧美α欧美αv大片| 激情图区综合网| 韩国一级黄色录像| 亚洲人午夜精品天堂一二香蕉| 91无套直看片红桃| 91精品在线麻豆| 精一区二区三区| 国产午夜手机精彩视频| 亚洲美女免费在线| yy6080午夜| 久久婷婷综合激情| 不卡电影一区二区三区| 欧美三级视频在线播放| 日产国产高清一区二区三区| 影音先锋制服丝袜| 亚洲婷婷国产精品电影人久久| 一级黄色大片免费看| 欧美电影一区二区| 国产综合久久久久影院| 国产黄色片在线免费观看| 亚洲高清在线精品| 中文字幕人妻一区二区三区在线视频| 亚洲国产精品精华液2区45| 91在线视频免费91| 日韩视频在线一区二区| 国产99久久久精品| 欧美电影在线免费观看| 国产麻豆精品在线观看| 欧美午夜电影网| 久久福利视频一区二区| www青青草原| 青青草原综合久久大伊人精品| 操她视频在线观看| 亚洲成人精品一区| 99久久久无码国产精品不卡| 亚洲激情第一区| 免费一级做a爰片久久毛片潮| 亚洲欧洲精品成人久久奇米网| 丰满人妻一区二区三区免费视频棣| 久久久亚洲精品一区二区三区| 91社区在线播放| 久久久久久亚洲综合| 久久黄色一级视频| 国产亚洲一二三区| 荫蒂被男人添免费视频| 国产精品久久久久久亚洲伦 | 国产精品第四页| 国产肉体xxxx裸体784大胆| 国产精品伦一区二区三级视频| 国产精品手机在线观看| 亚洲欧美在线aaa| 亚洲精品国产熟女久久久| 亚洲黄色免费电影| 一本一本久久a久久| 日韩精品电影一区亚洲| 91激情五月电影| 国产一区二区三区美女| 69堂精品视频| 99久久综合色| 久久精品一区二区三区四区| 97精品人妻一区二区三区蜜桃| 中文字幕中文字幕一区二区| 国产精品密蕾丝袜| 亚洲444eee在线观看| 色婷婷国产精品| 国产精品99久久不卡二区| 日韩欧美一级在线播放| 色婷婷狠狠18禁久久| 国产精品视频第一区| 亚洲理论片在线观看| 视频一区二区中文字幕| 在线欧美一区二区| 成人综合婷婷国产精品久久| 久久亚洲一区二区三区明星换脸| 日本五十肥熟交尾| 亚洲午夜激情网站| 在线观看成人免费视频| 懂色一区二区三区免费观看| 久久久综合激的五月天| 不卡一区二区在线观看| 亚洲高清免费视频| 欧美在线一二三四区| 懂色一区二区三区免费观看| 国产午夜亚洲精品羞羞网站| 亚洲a v网站| 免费欧美在线视频| 91麻豆精品国产91久久久 | 91尤物视频在线观看| 中文av一区二区| 国产精品18在线| 激情成人午夜视频| 久久综合五月天婷婷伊人| 久久国产精品无码一级毛片| 同产精品九九九| 91精品国产综合久久久久久漫画 | 中文字幕永久在线不卡| 欧美a级片免费看| 国产电影一区在线| 欧美国产精品劲爆| 中文字幕求饶的少妇| 国产福利视频一区二区三区| 久久精品一区蜜桃臀影院| 懂色av蜜桃av| 国产精品影视天天线| 国产日韩欧美精品在线| 少妇高潮一区二区三区喷水| 国产成人精品免费在线| 国产精品久久久久久久岛一牛影视| 国产美女久久久久久| 成人免费看黄yyy456| 国产精品伦一区二区三级视频| 黄视频网站免费看| 99热在这里有精品免费| 一二三区精品视频| 欧美片网站yy| 欧美亚一区二区三区| 精品一二三四在线| 欧美国产精品v| 色综合久久88色综合天天免费| 95精品视频在线| 亚洲第一福利一区| 日韩精品一区二区三区中文精品| caopeng视频| 国产69精品久久久久毛片| 亚洲日本在线视频观看| 欧美日韩一级二级| 超碰97人人干| 国产成人午夜精品影院观看视频| 国产精品国产a级| 欧美色窝79yyyycom| 亚洲男人在线天堂| 国产麻豆成人精品| 亚洲卡通欧美制服中文| 91精品免费观看| 五月婷婷欧美激情| av不卡一区二区三区| 五月天久久比比资源色| 久久久综合精品| 日本高清无吗v一区| chinese麻豆新拍video| 国内成人自拍视频| 亚洲色图在线播放| 日韩一区二区免费在线电影 | 国产精品色呦呦| 欧美色精品在线视频| 在线 丝袜 欧美 日韩 制服| 国产激情一区二区三区四区 | 亚洲精品国产无套在线观| 91精品国产免费| 三级黄色免费观看| 无码国产精品一区二区高潮| 蜜臀精品久久久久久蜜臀| 国产精品免费视频网站| 666欧美在线视频| 亚洲精品电影院| 无码人妻一区二区三区精品视频| 精品影视av免费| 一区二区三区蜜桃| 2023国产精品自拍| 欧美在线观看一区二区| 亚洲图片另类小说| 女女调教被c哭捆绑喷水百合| 精品午夜久久福利影院| 亚洲自拍欧美精品| 国产亚洲精品7777| 6080yy午夜一二三区久久| 日韩在线一卡二卡| 一区二区三区免费在线观看视频| 成人av网站大全| 精品一区二区综合| 亚洲一级二级三级在线免费观看| 久久久精品影视| 69av一区二区三区| 色婷婷激情综合| 国精产品一区一区| 搡老熟女老女人一区二区| eeuss鲁片一区二区三区|