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

主頁 > 知識庫 > 詳解RedisTemplate下Redis分布式鎖引發的系列問題

詳解RedisTemplate下Redis分布式鎖引發的系列問題

熱門標簽:宿遷便宜外呼系統平臺 魔獸2青云地圖標注 十堰營銷電銷機器人哪家便宜 貴州電銷卡外呼系統 北京400電話辦理收費標準 超呼電話機器人 山東外呼銷售系統招商 日本中國地圖標注 鄭州人工智能電銷機器人系統

      自己的項目因為會一直抓取某些信息,但是本地會和線上經常一起跑,造成沖突。這其實就是我們常說的分布式集群的問題了,本地和線上的服務器構成了集群以及QPS為2的小并發(其實也不叫并發,不知道拿什么詞形容?)。

     首先,分布式集群的問題大家都知道,會造成數據庫的插入重復問題,會造成一系列的并發性問題。

     解決的方式呢也大概如下幾點,百度以及谷歌上都能搜到的解決方式:

     1:數據庫添加唯一索引

     2:設計接口冪等性

     3:依靠中間件使用分布式鎖,而分布式鎖又分為Redis和Zookeeper

    由于Zookeeper我沒怎么接觸過,并且我項目中本來就引用了Redis,所以就想著用Redis來做分布式鎖,也高端洋氣上檔次點。

    首先基于Redis的操作,我們必須要保證其原子性,也就是要么全部成功,要么全部失敗,先從Redis的客戶端入手。

    就Redis客戶端而言,我們通過的操作是先使用setnx指令,如果成功則返回1,失敗則返回0

   可是就分布鎖鎖而言,一個常用的問題就是如果一個服務setnx成功了,但是在解鎖的時候如果發生了宕機或者一些特殊因素,導致無法解鎖,那么其他服務將陷入死鎖的狀態。所以,我們在用 setnx 的同時想著去用 expire 指令對鎖進行一個過期操作

 

   從指令可以看出 setnx 和 expire 指令是分開的,如果在這中間的空隙過程中如果有特殊因素導致指令無法繼續,也會導致死鎖的產生。

以下參考自老錢的 Redis 深度歷險:核心原理與應用實踐

   為了解決這個疑難,Redis 開源社區涌現了一堆分布式鎖的 library,專門用來解決這個問題。實現方法極為復雜,小白用戶一般要費很大的精力才可以搞懂。如果你需要使用分布式鎖,意味著你不能僅僅使用 Jedis 或者 redis-py 就行了,還得引入分布式鎖的 library。

  為了治理這個亂象,Redis 2.8 版本中作者加入了 set 指令的擴展參數,使得 setnx 和 expire 指令可以一起執行,徹底解決了分布式鎖的亂象。從此以后所有的第三方分布式鎖 library 可以休息了。

   

  以上都是基于Redis的操作,但是我們在JAVA中如何去運用分布式鎖呢。

  首先在Redis方面我用的是RedisTemplate對Redis進行操作的 ,而RedisTemplate在目前情況下如果不借助于是無法保證其原子性的,所以我們需要借助于Redis的Lua腳本。

   先上Lua腳本的代碼

// 加鎖
if 
    redis.call('setNx',KEYS[1],ARGV[1]) 
  then 
    if redis.call('get',KEYS[1])==ARGV[1] 
    return redis.call('expire',KEYS[1],ARGV[2]) 
  else 
    return 0 
  end 
end
 
// 解鎖
  redis.call('get', KEYS[1]) == ARGV[1] 
then 
  return redis.call('del', KEYS[1]) 
else 
  return 0 

    Java調用腳本有兩種方式

   1。新建一個腳本文件,在代碼中調用其絕對路徑地址

     redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource(地址)));

   2。在Java代碼中以字符串的方式傳入

    redisScript.setScriptText(腳本);

  我是用的第二種方式實現的,下面是JAVA代碼

/**
   * 獲取鎖
   * @param lockKey
   * @param value
   * @param expireTime:單位-秒
   * @return
   */
  public boolean getLock(String lockKey, String value, int expireTime){
    boolean ret = false;
    try{
      String script = "if redis.call('setNx',KEYS[1],ARGV[1]) then if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end end";
 
      RedisScriptLong> redisScript = new DefaultRedisScript>(script, Long.class);
 
      Object result = redisTemplate.execute(redisScript,new StringRedisSerializer(),new StringRedisSerializer(), Collections.singletonList(lockKey),value,expireTime + "");
      System.out.println(result + "-----------");
      //Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey),value,expireTime + "");
 
      if(SUCCESS.equals(result)){
        return true;
      }
 
    }catch(Exception e){
      e.printStackTrace();
    }
    return ret;
  }
 
  /**
   * 釋放鎖
   * @param lockKey
   * @param value
   * @return
   */
  public boolean releaseLock(String lockKey, String value){
 
    String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
 
    RedisScriptLong> redisScript = new DefaultRedisScript>(script, Long.class);
 
    Object result = redisTemplate.execute(redisScript,new StringRedisSerializer(),new StringRedisSerializer(), Collections.singletonList(lockKey),value);
    if(SUCCESS.equals(result)) {
      return true;
    }
 
    return false;
  }

   以上代碼已經在我的項目中確切可以使用了。但是在使用的過程中遇到了許多問題。

   1:java.lang.IllegalStateException

   在返回值方面,會經常報IllegalStateException。

RedisScriptString> redisScript = new DefaultRedisScript>(script, String.class);

   用String類型時候,經常會報類型轉換異常。我在代碼中使用的Long類型接收該類型,在命令行中我們也看到命令行結果返回的是數字0或者1,保險起見我們也可以用Object對象來接收結果集。

 2:ERR value is not an integer or out of range

  這個問題糾結了我一個下午至少,Redis報的異常都是很深的,從跟蹤源碼的時候看到,我們在調用redisTemplate.execute的方法時候,如果不傳序列化的參數的時候,代碼默認調用的是 Jdkserializationredisserializer 來進行序列化和反序列化操作,這是jdk自帶的序列化操作,使用該序列化的對象必須要實現Serializable接口。所以該序列化接口是用于對實體類的序列化。

   所以在進行 execute 操作的時候,我們傳入 Stringredisserializer,該序列化接口是專用于對字符串類型的序列化操作。具體的區別可以去這兩個類的源碼中看下他們的加密方式。 

因為時間以及個人能力的問題,對部分源碼有點未理解,所以沒有做到全方位的解讀這些異常的原因,以后有機會會將源碼細讀并分析其異常原因。

到此這篇關于詳解RedisTemplate下Redis分布式鎖引發的系列問題的文章就介紹到這了,更多相關RedisTemplate 分布式鎖內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解redis分布式鎖的這些坑
  • 基于Redis實現分布式鎖的方法(lua腳本版)
  • SpringBoot之使用Redis實現分布式鎖(秒殺系統)
  • 詳解Redis 分布式鎖遇到的序列化問題
  • redisson分布式鎖的用法大全
  • php基于redis的分布式鎖實例詳解
  • Redis分布式鎖升級版RedLock及SpringBoot實現方法
  • 利用redis實現分布式鎖,快速解決高并發時的線程安全問題
  • 詳解基于redis實現分布式鎖

標簽:朝陽 江蘇 吉安 北京 楊凌 大慶 果洛 臺州

巨人網絡通訊聲明:本文標題《詳解RedisTemplate下Redis分布式鎖引發的系列問題》,本文關鍵詞  詳解,RedisTemplate,下,Redis,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解RedisTemplate下Redis分布式鎖引發的系列問題》相關的同類信息!
  • 本頁收集關于詳解RedisTemplate下Redis分布式鎖引發的系列問題的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    欧美日韩亚洲国产综合| 亚洲美女一区二区三区| 免费精品视频在线| 男人网站在线观看| 欧美丝袜丝交足nylons图片| 国产精品久久久久久久久快鸭| 国产一区二区导航在线播放| 亚洲精品国产一区黑色丝袜 | 琪琪一区二区三区| v天堂中文在线| 欧美一区二区私人影院日本| 日韩黄色在线观看| 在线观看国产网站| 日韩一级欧美一级| 久久综合综合久久综合| 国产精品免费无码| 国产日产欧美精品一区二区三区| 国产精品综合一区二区三区| 小嫩苞一区二区三区| 国产精品少妇自拍| av电影天堂一区二区在线观看| 色综合久久99| 亚洲曰韩产成在线| 国产美女视频免费观看下载软件| 欧美一区二区免费视频| 久久精品国产成人一区二区三区| 一区二区三区伦理片| 国产欧美一区二区精品婷婷| 成人精品一区二区三区中文字幕| 色婷婷综合久久久中文字幕| 依依成人综合视频| 亚洲av无码一区二区三区观看| 欧美不卡视频一区| 国产老肥熟一区二区三区| 日本青青草视频| 亚洲成在线观看| 国产精品密蕾丝袜| 国产精品理伦片| 国产精久久久久| 精品国产欧美一区二区| 国产69精品久久久久毛片| 欧美在线你懂的| 青青草97国产精品免费观看 | 国产日产欧美一区二区三区| 成人黄色免费短视频| 欧美日韩1234| 九色综合国产一区二区三区| 欧美爱爱免费视频| 亚洲一二三区不卡| 影音先锋男人在线| 亚洲日穴在线视频| 欧美 日本 国产| 美女露出粉嫩尿囗让男人桶| 精品国产sm最大网站| 成人高清视频在线观看| 91精品欧美久久久久久动漫| 国产精品中文字幕一区二区三区| 91久久精品网| 免费在线成人网| 成年人av电影| 日本aⅴ精品一区二区三区| 永久免费看片直接| 婷婷开心激情综合| √天堂中文官网8在线| 五月天网站亚洲| 国产又粗又硬又长又爽| 丝瓜av网站精品一区二区| a级黄色免费视频| 亚洲电影在线免费观看| а天堂中文在线资源| 亚洲成人在线免费| 人人干在线观看| 视频精品一区二区| 一本在线高清不卡dvd| 麻豆成人免费电影| 91福利精品第一导航| 久久99国产乱子伦精品免费| 欧美色视频在线| 国产99久久久国产精品潘金网站| 91精品国产综合久久蜜臀| 成人免费视频视频| 精品日韩一区二区| 无码人妻一区二区三区免费n鬼沢| 国产色爱av资源综合区| 黄色免费看视频| 亚洲免费资源在线播放| 免费一级特黄3大片视频| 亚洲国产日韩一级| 天天看片中文字幕| 国产在线精品免费av| 91麻豆精品国产自产在线 | 在线精品国精品国产尤物884a| 狠狠色2019综合网| 日韩欧美一区二区免费| 好吊操视频这里只有精品| 中文字幕一区二区三区在线不卡| 欧美黄色一级生活片| 日本欧美一区二区三区| 欧美日韩精品一区二区三区| 9久草视频在线视频精品| 国产农村妇女精品| 国产1区2区在线观看| 麻豆成人综合网| 91精品国产色综合久久不卡电影| 欧美体内she精高潮| 日韩美女视频19| 看免费黄色录像| 国产精品一区在线观看你懂的| 欧美tickling挠脚心丨vk| 国产女人18毛片水真多18| 一区二区三区成人| 91久久线看在观草草青青| 成人av在线观| 国产精品每日更新| 黑鬼狂亚洲人videos| 国产精品一区二区久久不卡| 久久久亚洲国产美女国产盗摄 | 国产老女人精品毛片久久| 亚洲精品一线二线三线| 在线观看日韩精品视频| 视频一区二区三区中文字幕| 制服丝袜av成人在线看| 亚洲啪av永久无码精品放毛片 | 国产精品123| 国产日产欧美精品一区二区三区| 日本污视频网站| 国产精品自拍一区| 欧美国产精品久久| 久久国产高清视频| jizz一区二区| 樱花草国产18久久久久| 欧美日韩三级在线| 四虎精品一区二区| 三级欧美在线一区| 日韩美女视频一区二区在线观看| 欧美精品黑人猛交高潮| 免费一级片91| 久久久综合视频| 91传媒免费观看| jizzjizzjizz欧美| 一卡二卡三卡日韩欧美| 在线播放91灌醉迷j高跟美女| 荫蒂被男人添免费视频| 奇米影视一区二区三区小说| 精品国产乱码久久久久久闺蜜| 摸摸摸bbb毛毛毛片| 国产成人在线网站| 亚洲三级免费观看| 在线播放/欧美激情| 亚洲AV无码国产成人久久| 国产一区二区三区四区在线观看| 欧美激情一区二区三区在线| 一本色道亚洲精品aⅴ| 国产伦理在线观看| 天天色图综合网| 国产日产欧产精品推荐色| 极品盗摄国产盗摄合集| 性感美女一区二区三区| 蜜臀a∨国产成人精品| 国产日韩v精品一区二区| 91成人在线免费观看| 好吊色视频一区二区三区| 黑人巨大精品欧美一区| 亚洲视频小说图片| 日韩一二在线观看| 亚洲女人毛茸茸高潮| av在线免费观看不卡| 日韩av一区二区在线影视| 国产日韩精品一区二区三区 | 日韩成人免费电影| 欧美激情中文字幕| 欧美日韩三级视频| 日本猛少妇色xxxxx免费网站| www.av精品| 看片网站欧美日韩| 亚洲人成小说网站色在线| 日韩欧美国产1| 91在线播放观看| 极品粉嫩小仙女高潮喷水久久| 国产成人8x视频一区二区| 午夜国产精品一区| 中文字幕+乱码+中文字幕一区| 欧美日韩高清在线播放| www.涩涩爱| 香港三日本8a三级少妇三级99| 国产精品一级在线| 午夜激情综合网| 综合电影一区二区三区 | 精品伦精品一区二区三区视频密桃 | 91精品国产一区二区| 久久国产高清视频| 无码人妻精品一区二区三应用大全 | 国产丶欧美丶日本不卡视频| 亚洲成人7777| 国产精品欧美久久久久一区二区| 69久久夜色精品国产69蝌蚪网| 日韩欧美综合视频| 在线免费观看成年人视频| 91蜜桃传媒精品久久久一区二区| 国产在线麻豆精品观看|