欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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數(shù)據(jù)結(jié)構(gòu)類型示例解析

    Redis數(shù)據(jù)結(jié)構(gòu)類型示例解析

    這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)類型示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Redis安裝及基本數(shù)據(jù)類型

    Redis安裝及基本數(shù)據(jù)類型

    這篇文章主要介紹了Redis安裝及基本數(shù)據(jù)類型,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Redis增減庫存避坑的實(shí)現(xiàn)

    Redis增減庫存避坑的實(shí)現(xiàn)

    在電商平臺(tái)或者倉(cāng)庫管理系統(tǒng)中,庫存的管理是非常重要的一項(xiàng)任務(wù),本文主要介紹了Redis增減庫存避坑的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • redis過期回調(diào)坑的解決

    redis過期回調(diào)坑的解決

    Redis提供了一種過期回調(diào)的機(jī)制,可以在某個(gè)鍵過期時(shí)觸發(fā)一個(gè)回調(diào)函數(shù),然而,在實(shí)際使用中,我們往往會(huì)遇到一些災(zāi)難性的問題,其中一個(gè)就是在使用過期回調(diào)的時(shí)候,我們可能會(huì)遭遇到無法預(yù)料的錯(cuò)誤,本文就詳細(xì)的介紹一下
    2023-09-09
  • redis簡(jiǎn)單介紹及安裝使用小結(jié)

    redis簡(jiǎn)單介紹及安裝使用小結(jié)

    本文主要是對(duì)于redis初步學(xué)習(xí)的小結(jié)內(nèi)容,包括了redis介紹,redis安裝以及最簡(jiǎn)單的使用,希望大家能夠喜歡
    2018-11-11
  • Redis整合SpringBoot的RedisTemplate實(shí)現(xiàn)類(實(shí)例詳解)

    Redis整合SpringBoot的RedisTemplate實(shí)現(xiàn)類(實(shí)例詳解)

    這篇文章主要介紹了Redis整合SpringBoot的RedisTemplate實(shí)現(xiàn)類,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 詳解如何清理Redis內(nèi)存碎片

    詳解如何清理Redis內(nèi)存碎片

    操作系統(tǒng)的剩余空間總量足夠,但申請(qǐng)一塊N字節(jié)連續(xù)地址的空間時(shí),剩余內(nèi)存空間中沒有大小為N字節(jié)的連續(xù)空間,那么這些剩余內(nèi)存空間中,小于N字節(jié)的連續(xù)內(nèi)存空間就是內(nèi)存碎片,本文詳細(xì)介紹了如何清理Redis內(nèi)存碎片,需要的朋友可以參考一下
    2023-04-04
  • Rocky9部署redis的實(shí)現(xiàn)示例

    Rocky9部署redis的實(shí)現(xiàn)示例

    本文主要介紹了Rocky9部署redis的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Redis RDB技術(shù)底層原理詳解

    Redis RDB技術(shù)底層原理詳解

    為了使Redis在重啟之后仍能保證數(shù)據(jù)不丟失,需要將數(shù)據(jù)從內(nèi)存中以某種形式同步到硬盤中,這一過程就是持久化,本文重點(diǎn)給大家介紹Redis RDB技術(shù)底層原理實(shí)現(xiàn)方法,一起看看吧
    2021-09-09
  • 詳解Centos7下配置Redis并開機(jī)自啟動(dòng)

    詳解Centos7下配置Redis并開機(jī)自啟動(dòng)

    本篇文章主要介紹了Centos7下配置Redis并開機(jī)自啟動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-11-11

最新評(píng)論