亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決redis擊穿問題

發布時間:2020-06-25 12:22:01 來源:億速云 閱讀:186 作者:Leah 欄目:關系型數據庫

這篇文章將為大家詳細講解有關如何解決redis擊穿問題,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

擊穿:指的是單個key在緩存中查不到,去數據庫查詢,這樣如果數據量不大或者并發不大的話是沒有什么問題的。

如果數據庫數據量大并且是高并發的情況下那么就可能會造成數據庫壓力過大而崩潰

注意:這里指的是單個key發生高并發!!!

解決方案:

1) 通過synchronized+雙重檢查機制:某個key只讓一個線程查詢,阻塞其它線程

在同步塊中,繼續判斷檢查,保證不存在,才去查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;
   }

缺點: 會阻塞其它線程

2) 設置value永不過期

這種方式可以說是最可靠的,最安全的但是占空間,內存消耗大,并且不能保持數據最新 這個需要根據具體的業務邏輯來做

個人覺得如果要保持數據最新不放這么試試,僅供參考:

起個定時任務或者利用TimerTask 做定時,每個一段時間多這些值進行數據庫查詢更新一次緩存,當然前提時不會給數據庫造成壓力過大(這個很重要)

3) 使用互斥鎖(mutex key)

業界比較常用的做法,是使用mutex。簡單地來說,就是在緩存失效的時候(判斷拿出來的值為空),不是立即去load db,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key,當操作返回成功時,再進行load db的操作并回設緩存;否則,就重試整個get緩存的方法。

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

public String get(key) {
      String value = redis.get(key);
      if (value == null) { //代表緩存值過期
          //設置3min的超時,防止del操作失敗的時候,下次緩存過期一直不能load db
          if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表設置成功
               value = db.get(key);
                      redis.set(key, value, expire_secs);
                      redis.del(key_mutex);

                     return value;
              } else {  //這個時候代表同時候的其他線程已經load db并回設到緩存了,這時候重試獲取緩存值即可
                      sleep(10);
                      get(key);  //重試
              }
          } else {
              return value;      
          }

}

關于解決redis擊穿問題的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泽普县| 青川县| 鹿泉市| 阿城市| 宁乡县| 盘山县| 正蓝旗| 车致| 平度市| 东乌珠穆沁旗| 万全县| 阳江市| 汝州市| 会泽县| 陵川县| 闻喜县| 乌兰察布市| 资溪县| 金门县| 平原县| 辽源市| 屏南县| 绩溪县| 肥东县| 桐庐县| 黄浦区| 响水县| 苏尼特左旗| 葵青区| 吴川市| 江源县| 卓尼县| 吉安市| 凤翔县| 石狮市| 牟定县| 瑞昌市| 天柱县| 漳平市| 施秉县| 五家渠市|