Redis緩存雪崩骇钦,擊穿宛渐,穿透

1. Redis緩存雪崩

發(fā)生場景

當Redis服務(wù)器重啟或者大量緩存在同一時期失效時,此時大量的流量會全部沖擊到數(shù)據(jù)庫上面,數(shù)據(jù)庫有可能會因為承受不住而宕機霹肝;
所以此時的緩存層出現(xiàn)了錯誤,于是所有的請求都會到達存儲層错负,存儲層的調(diào)用量會暴漲氓仲,造成存儲層也完蛋了的情況;

解決方案

  • 均勻分布 : 我們應(yīng)該在設(shè)置失效時間時應(yīng)該盡量均勻的分布,比如失效時間是當前時間加上一個時間段的隨機值鳍烁,讓失效的時間保持隨機性叨襟,不在同一時間點失效。
  • 熔斷機制 : 類似于SpringCloud的熔斷器,我們可以設(shè)定閾值或監(jiān)控服務(wù),如果達到熔斷閾值(QPS,服務(wù)無法響應(yīng),服務(wù)超時)時,則直接返回,不再調(diào)用目標服務(wù),并且還需要一個檢測機制,如果目標服務(wù)已經(jīng)可以正常使用,則重置閾值,恢復使用幔荒。
  • 隔離機制 : 類似于Docker一樣,當一個服務(wù)器上某一個tomcat出了問題后不會影響到其它的tomcat,這里我們可以使用線程池來達到隔離的目的,當線程池執(zhí)行拒絕策略后則直接返回,不再向線程池中增加任務(wù)糊闽。
  • 限流/降流機制 : 其實限流就是熔斷機制的一個版本,設(shè)置閾值(QPS),達到閾值之后直接返回。
  • 雙緩存機制 : 將數(shù)據(jù)存儲到緩存中時存儲倆份,一份的有效期是正常的,一份的有效期長一點.不建議用這個方案,因為比較消耗內(nèi)存資源,畢竟Redis是直接存儲到內(nèi)存中的爹梁。
  • 集群/redis高可用:既然一臺redis扛不住右犹,那就多弄幾臺,這臺掛掉還有其它的可以繼續(xù)工作姚垃,也就是搭建的一個集群念链。
2. Redis緩存穿透

發(fā)生場景

當用戶想查詢某條數(shù)據(jù),發(fā)現(xiàn)redis數(shù)據(jù)庫沒有积糯,即緩存沒有命中掂墓;繼續(xù)向持久層數(shù)據(jù)庫查詢,還是沒有看成,即本次查詢失斁唷;當很多次用戶查詢都失敗川慌,于是請求都去請求 了持久層吃嘿;此時持久層的數(shù)據(jù)庫就會產(chǎn)生很大很大壓力,于是就出現(xiàn)了緩存穿透梦重。

解決方案

布隆過濾 : 我們可以預先將數(shù)據(jù)庫里面所有的key全部存到一個大的map里面,然后在過濾器中過濾掉那些不存在的key.但是需要考慮數(shù)據(jù)庫的key是會更新的,此時需要考慮數(shù)據(jù)庫 --> map的更新頻率問題
緩存空值 : 哪怕這條數(shù)據(jù)不存在但是我們?nèi)稳粚⑵浯鎯Φ骄彺嬷腥?設(shè)置一個較短的過期時間即可,并且可以做日志記錄,尋找問題原因

3. Redis緩存擊穿

緩存擊穿兑燥,是指一個key非常熱點,在不停的扛著大并發(fā)琴拧,大并發(fā)集中對這一個點進行訪問降瞳,當這個key在失效的瞬間,持續(xù)的大并發(fā)就穿破緩存艾蓝,直接請求數(shù)據(jù)庫力崇,就像在一個屏障上鑿開了一個洞。
比如當前的商品降價赢织,促銷亮靴;或者微博熱搜很多人同時訪問,那么這個Key就是一個熱點于置,同時扛著超高并發(fā)茧吊,集中訪問贞岭,緩存就被擊穿。

解決方案

1.使用互斥鎖(mutex key)

業(yè)界比較常用的做法搓侄,是使用mutex瞄桨。簡單地來說,就是在緩存失效的時候(判斷拿出來的值為空)讶踪,不是立即去load db芯侥,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key,當操作返回成功時乳讥,再進行l(wèi)oad db的操作并回設(shè)緩存柱查;否則,就重試整個get緩存的方法云石。
SETNX唉工,是「SET if Not eXists」的縮寫,也就是只有不存在的時候才設(shè)置汹忠,可以利用它來實現(xiàn)鎖的效果淋硝。在redis2.6.1之前版本未實現(xiàn)setnx的過期時間,所以這里給出兩種版本代碼參考:

//2.6.1前單機版本鎖
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 {  
        //其他線程休息50毫秒后重試  
        Thread.sleep(50);  
        get(key);  
    }  
  }  
}
最新版本代碼:
public String get(key) {
      String value = redis.get(key);
      if (value == null) { //代表緩存值過期
          //設(shè)置3min的超時宽菜,防止del操作失敗的時候谣膳,下次緩存過期一直不能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 {  //這個時候代表同時候的其他線程已經(jīng)load db并回設(shè)到緩存了,這時候重試獲取緩存值即可
                      sleep(50);
                      get(key);  //重試
              }
          } else {
              return value;      
          }
 }
mem

文獻參考:
https://baijiahao.baidu.com/sid=1655304940308056733&wfr=spider&for=pc
https://blog.csdn.net/zeb_perfect/article/details/54135506

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铅乡,一起剝皮案震驚了整個濱河市参歹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隆判,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僧界,死亡現(xiàn)場離奇詭異侨嘀,居然都是意外死亡,警方通過查閱死者的電腦和手機捂襟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門咬腕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葬荷,你說我怎么就攤上這事涨共。” “怎么了宠漩?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵举反,是天一觀的道長。 經(jīng)常有香客問我扒吁,道長火鼻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮魁索,結(jié)果婚禮上融撞,老公的妹妹穿的比我還像新娘。我一直安慰自己粗蔚,他們只是感情好尝偎,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹏控,像睡著了一般致扯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牧挣,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天急前,我揣著相機與錄音,去河邊找鬼瀑构。 笑死裆针,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的寺晌。 我是一名探鬼主播世吨,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呻征!你這毒婦竟也來了耘婚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陆赋,失蹤者是張志新(化名)和其女友劉穎沐祷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攒岛,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赖临,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灾锯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兢榨。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顺饮,靈堂內(nèi)的尸體忽然破棺而出吵聪,到底是詐尸還是另有隱情,我是刑警寧澤兼雄,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布吟逝,位于F島的核電站,受9級特大地震影響君旦,放射性物質(zhì)發(fā)生泄漏澎办。R本人自食惡果不足惜嘲碱,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望局蚀。 院中可真熱鬧麦锯,春花似錦、人聲如沸琅绅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽千扶。三九已至料祠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澎羞,已是汗流浹背髓绽。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妆绞,地道東北人顺呕。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像括饶,于是被迫代替她去往敵國和親株茶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容