成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 基于redis實(shí)現(xiàn)分布式鎖的原理與方法

基于redis實(shí)現(xiàn)分布式鎖的原理與方法

熱門標(biāo)簽:400電話辦理的口碑 廊坊外呼系統(tǒng)在哪買 b2b外呼系統(tǒng) 高碑店市地圖標(biāo)注app 地圖標(biāo)注工廠入駐 一個(gè)地圖標(biāo)注多少錢 四川穩(wěn)定外呼系統(tǒng)軟件 南京手機(jī)外呼系統(tǒng)廠家 臺灣電銷

前言

系統(tǒng)的不斷擴(kuò)大,分布式鎖是最基本的保障。與單機(jī)的多線程不一樣的是,分布式跨多個(gè)機(jī)器。線程的共享變量無法跨機(jī)器。

為了保證一個(gè)在高并發(fā)存場景下只能被同一個(gè)線程操作,java并發(fā)處理提供ReentrantLock或Synchronized進(jìn)行互斥控制。但是這僅僅對單機(jī)環(huán)境有效。我們實(shí)現(xiàn)分布式鎖大概通過三種方式。

  • redis實(shí)現(xiàn)分布式鎖
  • 數(shù)據(jù)庫實(shí)現(xiàn)分布式鎖
  • zk實(shí)現(xiàn)分布式鎖

今天我們介紹通過redis實(shí)現(xiàn)分布式鎖。實(shí)際上這三種和java對比看屬于一類。都是屬于程序外部鎖。

原理剖析

  • 上述三種分布式鎖都是通過各自為依據(jù)對各個(gè)請求進(jìn)行上鎖,解鎖從而控制放行還是拒絕。redis鎖是基于其提供的setnx命令。
  • setnx當(dāng)且僅當(dāng)key不存在。若給定key已經(jīng)存在,則setnx不做任何動(dòng)作。setnx是一個(gè)原子性操作。
  • 和數(shù)據(jù)庫分布式相比,因?yàn)閞edis內(nèi)存輕量。所以redis分布式鎖性能更好

實(shí)現(xiàn)

原理很簡單。結(jié)合springboot項(xiàng)目我們實(shí)現(xiàn)一套通過注解形式對接口進(jìn)行庫存上鎖案例進(jìn)行理解

編寫注解

我們編寫注解。方便我們在接口上添加注解提供攔截信息

/**
 * @author 張新華
 * @version V1.0
 * @Package com.ay.framework.order.redis.product
 * @date 2020年03月26日, 0026 10:29
 * @Copyright © 2020 安元科技有限公司
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface StockLock {

  /**
   * @author zxhtom
   * @Description 鎖key的前綴
   * @Date 15:25 2020年03月25日, 0025
   * @Param []
   * @return java.lang.String
   */
  String prefix() default "";
  /**
   * @author zxhtom
   * @Description key的分隔符
   * @Date 15:27 2020年03月25日, 0025
   * @Param []
   * @return java.lang.String
   */
  String delimiter() default ":";
}
/**
 * @author 張新華
 * @version V1.0
 * @Package com.ay.framework.order.redis.product
 * @date 2020年03月26日, 0026 11:09
 * @Copyright © 2020 安元科技有限公司
 */
@Target({ElementType.PARAMETER , ElementType.METHOD , ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface StockParam {
  /**
  * @author zxhtom
  * @Description 組成key
  * @Date 11:11 2020年03月26日, 0026
  * @Param []
  * @return java.lang.String[]
  */
  String[] names() default {""};
}

攔截器攔截

redis分布式鎖實(shí)現(xiàn)的關(guān)鍵就是攔截器的編寫。上面的注解只是為了實(shí)現(xiàn)攔截的一個(gè)輔助。

@Around("execution(public * *(..))  @annotation(com.ay.framework.order.redis.product.StockLock)")

通過springboot的Around進(jìn)行針對StockLock注解的攔截。通過攔截我們可以獲取到攔截的方法、參數(shù)、及需要的鎖的參數(shù)。

我們獲取到需要鎖的名稱這里叫做【a】之后通過redis的原子性操作對該key進(jìn)行遞減操作。

為了方便我們在削減庫存的時(shí)候可以對庫存進(jìn)行更新操作。我們在遞減庫存前還需要借助于另一把鎖。 這一把鎖我們叫做【a_key】

換句話說我們接口想訪問就必須獲取【a】鎖,拿到【a】鎖需要減少庫存。減少庫存之前需要獲取【a_key】鎖。

拿到鎖之后處理完邏輯之后我們需要釋放對應(yīng)鎖。

RedisAtomicLong entityIdCounter = new RedisAtomicLong(lockKey, redisTemplate.getConnectionFactory());
  if (redisTemplate.hasKey(CoreConstants.UPDATEPRODUCTREDISLOCKKEY + lockKey)) {
    //表示lockKey的庫存信息有變動(dòng)。此時(shí)無法進(jìn)行交易
    throw new BusinessException("庫存變動(dòng)。暫無法交易");
  }
  Long increment = entityIdCounter.decrementAndGet();
  if (increment >= 0) {
    try {
      Object proceed = pjp.proceed();
    } catch (Throwable throwable) {
      //所占資源需要釋放回資源池
      while (!redisLock.tryGetLock(CoreConstants.UPDATEPRODUCTREDISLOCKKEY + lockKey, "")) {

      }
      //表示lockKey的庫存信息有變動(dòng)。此時(shí)無法進(jìn)行交易
      long l = entityIdCounter.incrementAndGet();
      if (l  1) {
        redisTemplate.opsForValue().set(lockKey,1);
      }
      redisLock.unLock(CoreConstants.UPDATEPRODUCTREDISLOCKKEY + lockKey);
      throwable.printStackTrace();
    }
  } else {
    redisTemplate.opsForValue().set(lockKey,0);
    throw new BusinessException("庫存不足!無法操作");
  }

因?yàn)槲覀兩湘i就需要釋放鎖。但是程序在中途處理業(yè)務(wù)是發(fā)生異常導(dǎo)致沒有走到釋放鎖的步驟。這個(gè)時(shí)候就導(dǎo)致我們的分布式鎖一直被鎖。俗稱【死鎖】。為了避免這種場景的發(fā)生。我們常常在上鎖的時(shí)候給一個(gè)有效期。有效期已過自動(dòng)釋放鎖。這個(gè)特性恰好和redis的過期策略不摩爾和。

上述提及工具

RedisLock

public Boolean tryGetLock(String key , String value) {
  return tryGetLock(key, value, -1, TimeUnit.DAYS);
}
public Boolean tryGetLock(String key , String value, Integer expire) {
  return tryGetLock(key, value, expire, TimeUnit.SECONDS);
}
public Boolean tryGetLock(String key , String value, Integer expire , TimeUnit timeUnit) {
  ValueOperations operations = redisTemplate.opsForValue();
  if (operations.setIfAbsent(key, value)) {
    //說明 redis沒有該key , 換言之 加鎖成功 設(shè)置過期時(shí)間防止死鎖
    if (expire > 0) {
      redisTemplate.expire(key, expire, timeUnit);
    }
    return true;
  }
  return false;
}

public Boolean unLock(String key) {
  return redisTemplate.delete(key);
}

StockKeyGenerator

@Component()
@Primary
public class StockKeyGenerator implements CacheKeyGenerator {
  @Override
  public String getLockKey(ProceedingJoinPoint pjp) {
    //獲取方法簽名
    MethodSignature signature = (MethodSignature) pjp.getSignature();
    Method method = signature.getMethod();
    //獲取方法cacheLock注解
    StockLock stockLock = method.getAnnotation(StockLock.class);
    //獲取方法參數(shù)
    Object[] args = pjp.getArgs();
    Parameter[] parameters = method.getParameters();
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i  parameters.length; i++) {
      StockParam stockParam = parameters[i].getAnnotation(StockParam.class);
      Object arg = args[i];
      if (arg instanceof Map) {
        MapString, Object> temArgMap = (MapString, Object>) arg;
        String[] names = stockParam.names();
        for (String name : names) {
          if (builder.length() > 0) {
            builder.append(stockLock.delimiter());
          }
          builder.append(temArgMap.get(name));
        }
      }

    }
    return builder.toString();
  }
}

問題分析

上面分析了一個(gè)死鎖的場景,理論上出了死鎖我們r(jià)edis分布鎖很好的解決了分布式問題。但是還是會出現(xiàn)問題。下面列舉寫小編遇到的問題。

業(yè)務(wù)處理時(shí)間>上鎖過期時(shí)間

a線程獲取到鎖,開始進(jìn)行業(yè)務(wù)處理需要8S,

在8S內(nèi),鎖的有效期是5S,在鎖過期后也就是第6S , b線程進(jìn)入開始獲取鎖這個(gè)時(shí)候b是可以獲取到新鎖的。這個(gè)時(shí)候就是有問題的。

假設(shè)b線程業(yè)務(wù)處理只需要3S , 但是因?yàn)閍線程釋放了鎖,所以在第8S的時(shí)候雖然b線程沒有釋放鎖,b的鎖也沒有過期但是這時(shí)候也沒有了鎖。從而導(dǎo)致C線程也可以進(jìn)入

總結(jié)

到此這篇基于redis實(shí)現(xiàn)分布式鎖的原理與方法的文章就介紹到這了,更多相關(guān)redis分布式鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Redis分布式鎖的使用和實(shí)現(xiàn)原理詳解
  • redission分布式鎖防止重復(fù)初始化問題
  • php redis setnx分布式鎖簡單原理解析
  • redis分布式鎖及會出現(xiàn)的問題解決
  • SpringBoot整合Redis正確的實(shí)現(xiàn)分布式鎖的示例代碼
  • SpringBoot使用Redis實(shí)現(xiàn)分布式鎖
  • php基于redis的分布式鎖實(shí)例詳解

標(biāo)簽:南寧 泰州 拉薩 甘南 定州 畢節(jié) 伊春 河源

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《基于redis實(shí)現(xiàn)分布式鎖的原理與方法》,本文關(guān)鍵詞  基于,redis,實(shí)現(xiàn),分布式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于redis實(shí)現(xiàn)分布式鎖的原理與方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于基于redis實(shí)現(xiàn)分布式鎖的原理與方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    超碰caoprom| 色视频www在线播放国产人成| 丁香婷婷在线| 羞羞视频在线观看免费| av成人动漫在线观看| 四虎成人精品免费影院| 欧美理论在线观看| 天堂中文最新版在线中文| 六月丁香综合| 中文在线免费看视频| 国产精品自产拍在线网站| 亚洲在线播放| 性xxxx欧美老肥妇牲乱| 中文字幕一区二区三区人妻四季| 欧美成人激情在线| proumb性欧美在线观看| 三级av在线免费观看| 国产精品扒开腿做爽爽爽软件| 综合久久国产九一剧情麻豆| 国产精品xxxav免费视频| 国产一区精品视频| 国产成+人+综合+亚洲欧美丁香花| 大香伊人中文字幕精品| 久久视频免费在线观看| 国产区在线视频| 精品在线欧美视频| 国产免费av一区二区| 欧美性受xxxx黒人xyx性爽| 国产私拍一区| 欧美成人精品一级| 波多结衣在线观看| 国产乱女淫av麻豆国产| 欧美欧美黄在线二区| 久久综合成人精品亚洲另类欧美| 亚洲丝袜精品丝袜在线| 日韩女优在线播放| 欧美天堂亚洲电影院在线播放| 亚洲二区在线播放视频| 欧美成人免费全部| 国产午夜精品理论片a级大结局| jizzjizz少妇亚洲水多| 欧美激情在线狂野欧美精品| 亚洲国产精品综合| 成人444kkkk在线观看| 国产一级做a爰片在线看免费| 亚洲一区综合| 在线观看操人| 国产一级二级视频| 日韩不卡在线观看日韩不卡视频| 香港三级经典全部种子下载| yourporn久久国产精品| 国产精品情趣视频| 四虎成人欧美精品在永久在线| 久久国产精品亚洲| 国产偷国产偷亚洲高清97cao| 女人抽搐喷水高潮国产精品| 欧美日韩视频在线一区二区观看视频| 国产极品国产极品| 欧美日韩在线国产| 国产精品第6页| 精品无码在线观看| 日韩av中文在线观看| 国产精品久久久久一区二区三区共| 亚洲电影免费观看高清完整版在线观看| 精品久久在线播放| 欧美福利网址| 永久免费av无码网站性色av| 久久99精品久久久久久琪琪| 日本japanese极品少妇| 91牛牛免费视频| eeuss鲁片一区二区三区在线观看| 日韩不卡在线观看| 欧美特大特白屁股xxxx| 综合欧美视频一区二区三区| 第一福利在线视频| 国产精品一区牛牛影视| 久久精品一级爱片| 亚洲国产私拍精品国模在线观看| 日韩亚洲精品视频| 99视频精品全部免费在线视频| 涩涩涩999| 国产一区二区日韩精品| 台湾佬中文娱乐久久久| 无码人妻精品一区二区三区不卡| 色综合色综合色综合色综合色综合| 91精品动漫在线观看| 国产色91在线| 亚洲中文字幕无码av永久| 久久99精品久久久久久园产越南| 欧美日韩三级电影在线| 欧美色图影院| 欧美高清一级片| 女生裸体免费视频| 中文字幕欧美精品日韩中文字幕| 每日更新成人在线视频| 久久久久久久99| 迷人的保姆韩国| 最近2019年手机中文字幕| 免费在线观看黄色| 国产经典一区二区三区| 国产美女精品视频免费观看| 狠狠色狠狠色综合系列| 久久人人爽人人爽人人片av不| 亚洲精品久久久久久久久| 国产在线色视频| 调教驯服丰满美艳麻麻在线视频| 欧美日韩一区在线| 国产福利一区二区三区视频在线| 国产成人在线观看免费网站| 无码人妻精品一区二区三区温州| 99色这里只有精品| 亚洲一区二区三区四区中文字幕| 一本到不卡精品视频在线观看| 中文字幕在线一区二区三区| 成人做爰69片免费| 春意影院在线| 国产无码精品在线播放| 日韩人妻精品中文字幕| 国产精品福利一区二区| 国产乱码精品一品二品| 狠狠人妻久久久久久综合| 亚洲精选一二三| 国产对白在线正在播放| 极品魔鬼身材女神啪啪精品| 精品91福利视频| aa视频在线免费观看| 日韩在线欧美在线| 国产黄色一区二区三区| 欧妇女乱妇女乱视频| 亚洲激情网址| 国产在线观看黄| 国产在线观看18| 永久免费看片在线播放| 亚洲一区二区三区在线| 国产免费高清一区| 国产经典三级在线| 四虎4545www国产精品| 91九色丨porny丨肉丝| 久久99久久99精品免观看粉嫩| 高h放荡受浪受bl| 欧美大胆性生话| 精品视频国产| 天天操天天摸天天干| 精品亚洲成人| 久久精品亚洲| 国产成人久久精品一区二区三区| 日本色图欧美色图| 热久久精品国产| 一区二区三区在线播放| 97精品久久人人爽人人爽| 国产一区二区在线免费视频| 久久国产精品色av免费看| 日韩中文字幕在线视频播放| 国产精品免费久久久久久| 国产亚洲va综合人人澡精品| 2022中文字幕| 欧美在线亚洲在线| 日韩精品卡通动漫网站| 欧美午夜美女看片| 91久久精品国产91性色tv| 久久天堂夜夜一本婷婷麻豆| 国产一区二区三区在线免费| cao在线视频| 欧美做受喷浆在线观看| 无码一区二区三区视频| 26uuu另类亚洲欧美日本一| 精品久久久视频| 日韩中文字幕视频| 国产一区精品在线| 国产视频自拍一区| 亚洲xxxx3d| 日韩欧美在线综合网| 精品伦精品一区二区三区视频密桃| 韩国女同性做爰三级| 久久亚洲精品大全| 国产精品15p| 国产三区视频在线观看| 欧美一级夜夜爽| 99精品欧美一区二区| 精品欧美不卡一区二区在线观看| ...av二区三区久久精品| 久久久香蕉视频| 日韩国产精品亚洲а∨天堂免| 国产福利一区二区三区在线视频| 色噜噜久久综合伊人一本| 国产大学生自拍| 欧美成aaa人片在线观看蜜臀| 欧美一级在线视频| 欧美成人三级| 欧美午夜不卡| 成人免费黄色网址| 性欧美黑人xxxx| 99久久精品国产导航| 免费的黄色片| 欧美日本一区二区视频在线观看| 欧美精品二区| 五月婷婷综合激情网| av成人毛片| 色悠悠在线视频| 在线观看视频欧美| 国产一区二区丝袜高跟鞋图片| 中文字幕无码精品亚洲35| 色综合99久久久无码国产精品| 青青草av在线播放| 国产精品亚洲精品| 天天色天天草天天射| 成人国产一区二区三区精品麻豆| 美女视频一区免费观看| 91国产免费看| 国产成人在线视频观看| 高清av在线| 久久久久久久久久网| 色屁屁www国产馆在线观看| 午夜一区二区三区四区| 亚洲成人av电影| 亚洲一区国产精品| 久久精品日产第一区二区三区精品版| 国产人成精品| jlzzjlzz国产精品久久| 亚洲天堂成人在线| 久久伊人精品一区二区三区| av色综合久久天堂av综合| 国产在线一二三| 亚洲欧美日韩一二三区| 日本a级c片免费看三区| 日本一区二区在线免费观看| 91福利免费在线| 中文字幕剧情在线观看一区| 国产精品www色诱视频| 9l视频自拍蝌蚪9l视频成人| 黄色网在线视频| 18+视频在线观看| 国产精品吹潮在线观看| 国产精品高潮呻吟久久av无限| 中文字幕2022永久在线| 中文字幕码精品视频网站| 三级黄色网址| 91视频国产资源| 日韩视频在线免费| 亚洲欧洲另类国产综合| 精品一区二区三区日韩| 欧美日本不卡视频| 日本欧美加勒比视频| 91精品国产综合久久香蕉| 日韩精品国产精品| 日本久久亚洲电影| 国产精品久久久久不卡| 在线视频成人| 中文字幕亚洲乱码| 国产一级理论片| 亚洲大型综合色站| 伊人一区二区三区| 精品人妻无码一区二区三区蜜桃一| 免费一级特黄3大片视频| 国产极品嫩模在线视频一区| 2022国产精品视频| 综合av色偷偷网| 亚洲热app| 97超碰资源站| 免费成人毛片| 青青草观看免费视频在线| 亚洲欧美日韩人成在线播放| 一区二区三区高清| 国内一区二区在线视频观看| 欧美日韩免费观看一区三区| 91福利精品在线观看| 蜜桃网站在线观看| 一区二区三区四区乱视频| 黄色影片网站| 凹凸av导航大全精品| 日本黄视频在线观看| 韩国成人福利片在线播放| 影音先锋日韩资源| 精精国产xxxx视频在线野外| 中文字幕精品一区二区三区精品| 自拍偷拍亚洲欧美| 日本一级片免费| 欧美亚洲愉拍一区二区| 亚洲视频一二区| 一本色道久久综合狠狠躁篇怎么玩| 巨胸喷奶水www久久久免费动漫| 欧美视频一二三| 91香蕉视频污| 少妇太紧太爽又黄又硬又爽小说| 亚洲国产sm捆绑调教视频| 亚洲码国产岛国毛片在线| 日本少妇激情舌吻| 亚洲人成欧美中文字幕| 亚洲精品一区av在线播放| 2020日本不卡一区二区视频| 中文字幕日本最新乱码视频| 黄色工厂这里只有精品| 中文字幕在线观看成人| 欧美在线中文字幕| 精品久久久久久综合日本欧美| 亚洲欧美日韩在线高清直播| 久草视频精品在线| 韩日视频在线| 在线观看日韩www视频免费| 国产精品99久久久久久似苏梦涵| 你懂的在线观看一区二区| 男人添女人下部视频免费| 影音先锋在线亚洲| 国产精品大片wwwwww| 最新国产在线视频| 国内精品久久久久久久| 欧美特黄一区二区三区| 成人av片网址| 亚洲国产成人爱av在线播放| 亚洲小说区图片区情欲小说| 亚洲福利网站| 欧美一级二级三级九九九| av电影高清在线观看| 国产亚洲欧美一区在线观看| 亚洲一区尤物| 国产麻豆91视频| 99在线免费视频观看| 免费视频二区| 欧美老少做受xxxx高潮| 久久久国产一区| 午夜精品福利一区二区| 黑人巨大国产9丨视频| 91久久精品无码一区二区| 极品少妇一区二区| 国产精品视频麻豆| 99久久国产综合精品女小说| 人妻熟女aⅴ一区二区三区汇编| 97久久久免费福利网址|