最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

redis擊穿現(xiàn)象如何防止

 更新時(shí)間:2023年07月27日 10:14:46   作者:逆流°只是風(fēng)景-bjhxcc  
本文主要介紹了redis擊穿現(xiàn)象如何防止,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

背景

大家都知道,計(jì)算機(jī)的瓶頸之一就是IO,為了解決內(nèi)存與磁盤速度不匹配的問題,產(chǎn)生了緩存,將一些熱點(diǎn)數(shù)據(jù)放在內(nèi)存中,隨用隨取,降低連接到數(shù)據(jù)庫的請(qǐng)求鏈接,避免數(shù)據(jù)庫掛掉。需要注意的是,無論是擊穿還是后面談到的穿透與雪崩,都是在高并發(fā)前提下 ,當(dāng)緩存中某一個(gè)熱點(diǎn)key失效。

擊穿

指的是單個(gè)key在緩存中查不到,去數(shù)據(jù)庫查詢,這樣如果數(shù)據(jù)量不大或者并發(fā)不大的話是沒有什么問題的。

如果數(shù)據(jù)庫數(shù)據(jù)量大并且是高并發(fā)的情況下那么就可能會(huì)造成數(shù)據(jù)庫壓力過大而崩潰

注意: 這里指的是單個(gè)key發(fā)生高并發(fā)!!!

案例

這里要注意的是這是某一個(gè)熱點(diǎn)key過期失效和后面介紹緩存雪崩是有區(qū)別的。比如淘寶雙十一,對(duì)于某個(gè)特價(jià)熱門的商品信息,緩存在Redis中,剛好0點(diǎn),這個(gè)商品信息在Redis中過期查不到了,這時(shí)候大量的用戶又同時(shí)正好訪問這個(gè)商品,就會(huì)造成大量的請(qǐng)求同時(shí)到達(dá)數(shù)據(jù)庫。

解決方案

通過synchronized+雙重檢查機(jī)制

某個(gè)key只讓一個(gè)線程查詢,阻塞其它線程

在同步塊中,繼續(xù)判斷檢查,保證不存在,才去查DB。

例如:

 private static volaite Object lockHelp=new Object();
   public String getValue(String key){
     String value=redis.get(key,String.class);
     if(value=="null"||value==null||StringUtils.isBlank(value){
         synchronized(lockHelp){
                value=redis.get(key,String.class);
                 if(value=="null"||value==null||StringUtils.isBlank(value){
                     value=db.query(key);
                      redis.set(key,value,1000);
                  }
            }
           }    
        return value;
   }

缺點(diǎn): 會(huì)阻塞其它線程

設(shè)置value永不過期(設(shè)置熱點(diǎn)數(shù)據(jù)永不過期)

這種方式可以說是最可靠的,最安全的但是占空間,內(nèi)存消耗大,并且不能保持?jǐn)?shù)據(jù)最新 這個(gè)需要根據(jù)具體的業(yè)務(wù)邏輯來做

個(gè)人覺得如果要保持?jǐn)?shù)據(jù)最新不放這么試試,僅供參考:

起個(gè)定時(shí)任務(wù)或者利用TimerTask 做定時(shí),每個(gè)一段時(shí)間多這些值進(jìn)行數(shù)據(jù)庫查詢更新一次緩存,當(dāng)然前提時(shí)不會(huì)給數(shù)據(jù)庫造成壓力過大(這個(gè)很重要)

使用互斥鎖(mutex key)

業(yè)界比較常用的做法,是使用mutex。簡(jiǎn)單地來說,就是在緩存失效的時(shí)候(判斷拿出來的值為空),不是立即去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」的縮寫,也就是只有不存在的時(shí)候才設(shè)置,可以利用它來實(shí)現(xiàn)鎖的效果。在redis2.6.1之前版本未實(shí)現(xiàn)setnx的過期時(shí)間,所以這里給出兩種版本代碼參考:

public String get(key) {
      String value = redis.get(key);
      if (value == null) { //代表緩存值過期
          //設(shè)置3min的超時(shí),防止del操作失敗的時(shí)候,下次緩存過期一直不能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);
                     return value;
              } else {  //這個(gè)時(shí)候代表同時(shí)候的其他線程已經(jīng)load db并回設(shè)到緩存了,這時(shí)候重試獲取緩存值即可
                      sleep(10);
                      get(key);  //重試
              }
          } else {
              return value;      
          }
}

缺點(diǎn):

  • 代碼復(fù)雜度增大
  • 存在死鎖的風(fēng)險(xiǎn)
  • 存在線程池阻塞的風(fēng)險(xiǎn)

擊穿與雪崩的不同在于緩存key失效的量級(jí)上。擊穿是對(duì)于單個(gè)key值的緩存失效過期,雪崩則是大面積key同時(shí)失效。

到此這篇關(guān)于redis擊穿現(xiàn)象如何防止的文章就介紹到這了,更多相關(guān)redis 擊穿內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Redis常見延遲問題定位與分析

    淺談Redis常見延遲問題定位與分析

    大部分時(shí)候,redis延遲很低,但是在某些時(shí)刻,有些redis實(shí)例會(huì)出現(xiàn)很高的響應(yīng)延時(shí),本文主要介紹了淺談Redis常見延遲問題定位與分析,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-06-06
  • 手把手教你使用redis實(shí)現(xiàn)排行榜功能

    手把手教你使用redis實(shí)現(xiàn)排行榜功能

    使用Redis中有序集合的特性來實(shí)現(xiàn)排行榜是又好又快的選擇,一般排行榜都是有實(shí)效性的,比如“用戶積分榜”,下面這篇文章主要給大家介紹了關(guān)于使用redis實(shí)現(xiàn)排行榜功能的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Redis中主鍵失效的原理及實(shí)現(xiàn)機(jī)制剖析

    Redis中主鍵失效的原理及實(shí)現(xiàn)機(jī)制剖析

    這篇文章主要介紹了Redis中主鍵失效的原理及實(shí)現(xiàn)機(jī)制剖析,本文講解了失效時(shí)間的控制、失效的內(nèi)部實(shí)現(xiàn)、Memcached 刪除失效主鍵的方法與 Redis 有何異同、Redis 的主鍵失效機(jī)制會(huì)不會(huì)影響系統(tǒng)性能等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Redis持久化深入詳解

    Redis持久化深入詳解

    這篇文章主要介紹了Redis持久化深入詳解,講解的還是比較詳細(xì)的,有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • Redis 哨兵機(jī)制及配置實(shí)現(xiàn)

    Redis 哨兵機(jī)制及配置實(shí)現(xiàn)

    本文主要介紹了Redis 哨兵機(jī)制及配置實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis實(shí)現(xiàn)布隆過濾器的方法及原理

    Redis實(shí)現(xiàn)布隆過濾器的方法及原理

    布隆過濾器優(yōu)點(diǎn)是空間效率和查詢時(shí)間都比一般的算法要好的多,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難。本文將介紹布隆過濾器的原理以及Redis如何實(shí)現(xiàn)布隆過濾器,感興趣的朋友跟隨小編一起看看吧
    2019-12-12
  • redis replication環(huán)形緩沖區(qū)算法詳解

    redis replication環(huán)形緩沖區(qū)算法詳解

    這篇文章主要介紹了redis replication環(huán)形緩沖區(qū)算法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Redis整合Spring結(jié)合使用緩存實(shí)例

    Redis整合Spring結(jié)合使用緩存實(shí)例

    這篇文章主要介紹了Redis整合Spring結(jié)合使用緩存實(shí)例,介紹了如何在Spring中配置redis,并通過Spring中AOP的思想,將緩存的方法切入到有需要進(jìn)入緩存的類或方法前面。需要的朋友可以參考下
    2015-12-12
  • 關(guān)于Redis的內(nèi)存淘汰策略詳解

    關(guān)于Redis的內(nèi)存淘汰策略詳解

    當(dāng)內(nèi)存空間使用達(dá)到限制時(shí),Redis 會(huì)根據(jù)配置策略來選擇不同處理方式,要么返回 errors,要么按照不同的策略算法來清除一些舊數(shù)據(jù),達(dá)到回收內(nèi)存的目的,這就是 Redis 的內(nèi)存淘汰,有些文章中,內(nèi)存淘汰也叫緩存回收,需要的朋友可以參考下
    2023-05-05
  • 基于Redis實(shí)現(xiàn)消息隊(duì)列的示例代碼

    基于Redis實(shí)現(xiàn)消息隊(duì)列的示例代碼

    消息隊(duì)列在分布式系統(tǒng)中非常重要,能夠有效解耦系統(tǒng)的各個(gè)模塊,提供異步處理能力和緩沖能力,本文介紹了基于Redis實(shí)現(xiàn)消息隊(duì)列的示例代碼,感興趣的可以了解一下
    2025-04-04

最新評(píng)論

昌乐县| 濮阳县| 丹凤县| 九龙县| 缙云县| 福州市| 承德市| 金乡县| 县级市| 宾阳县| 兴文县| 神木县| 阿拉尔市| 青浦区| 汉阴县| 时尚| 肥乡县| 铜川市| 巴青县| 息烽县| 靖江市| 磐石市| 临猗县| 揭阳市| 泗阳县| 仪陇县| 常熟市| 宁城县| 仁布县| 东兴市| 灯塔市| 永善县| 潜山县| 邯郸县| 海伦市| 元阳县| 东港市| 开封县| 中方县| 剑阁县| 宁晋县|