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

淺談Java分布式架構(gòu)下如何實(shí)現(xiàn)分布式鎖

 更新時(shí)間:2020年07月24日 16:42:46   作者:林口  
這篇文章主要介紹了淺談Java分布式架構(gòu)下如何實(shí)現(xiàn)分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

  01分布式鎖運(yùn)用場(chǎng)景

  互聯(lián)網(wǎng)秒殺,搶優(yōu)惠卷,接口冪等性校驗(yàn)。咱們以互聯(lián)網(wǎng)秒殺為例。

 @RestController
  @Slf4j
  publicclassIndexController{
  @Autowired
  privateRedissonredission;
  @Autowired
  privateStringRedisTemplatestringRedisTemplate;
  @RequestMapping("/deduct_stock")
  publicStringdeductStock()throwsInterruptedException{
  intstock=Integer.parseInt
  (stringRedisTemplate.opsForValue().get("stock"));
  if(stock>0){
  intrealStock=stock-1;
  stringRedisTemplate.opsForValue().set("stock",realStock+"");
  log.info("扣減成功,剩下庫(kù)存+"+realStock);
  }else{
  return"庫(kù)存不足";
  }
  return"end";
  }
  }

  上面代碼假定多個(gè)線程一起進(jìn)來(lái),讀到胡成果相同,寫(xiě)入的成果也相同。造成多個(gè)減庫(kù)存操作,只減少了一次。

 好多人想到的處理方式是加synchronized,但是假如是集群項(xiàng)目呢?搭建的是負(fù)載均衡項(xiàng)目。打開(kāi)了兩個(gè)jvm進(jìn)程,jvm進(jìn)程鎖失效。

  用nginx做負(fù)載均衡,啟用兩個(gè)服務(wù)。進(jìn)行下壓測(cè)。成果和咱們想的相同,用suynchronized關(guān)鍵字加鎖,兩臺(tái)服務(wù)器打印的剩下庫(kù)存有相同的。所以這種方法并沒(méi)有完成線程安全。

  02根據(jù)redisson完成分布式鎖

  咱們r(jià)edis中有一個(gè)SETNXKEYVALUE,這個(gè)指令的時(shí)刻復(fù)雜度為O(1),只在鍵key不存在的情況下,將鍵key的值設(shè)置為value,若鍵key現(xiàn)已存在,則setnx指令不做任何操作,指令在設(shè)置成功時(shí)返回一,失利時(shí)分返回0.

  那么咱們能夠簡(jiǎn)單用這個(gè)指令,完成一個(gè)十分簡(jiǎn)單的分布式鎖。Springboot結(jié)構(gòu)中咱們運(yùn)用這個(gè):

  stringRedisTemplate.opsForValue().setIfAbsent(),它底層是對(duì)setnx的封裝。

  這樣完成有什么問(wèn)題?

  假如第一個(gè)線程拋了異常中斷了,其它線程就永遠(yuǎn)不能處理了,所以咱們加上trycatch,finally。在finally里面delete咱們存的key值。

  假如程序宕機(jī)怎么辦?不是可捕獲異常怎么辦?

  這時(shí)分程序履行到?jīng)]有釋放鎖,即key值一向存在,在發(fā)動(dòng)web服務(wù)的時(shí)分其它線程也一向不等待。這時(shí)分會(huì)一向存在死鎖,咱們是不是參加鎖的超時(shí)時(shí)刻是否能夠,即
  stringRedisTemplate.expire()

  程序迭代的過(guò)程是逐步的優(yōu)化,假定我還沒(méi)來(lái)的及給鎖設(shè)置時(shí)長(zhǎng),服務(wù)就宕掉了,這時(shí)分該怎么辦。

  用兩行指令履行咱們能夠換成一行的指令,及設(shè)置key值的時(shí)分,一起設(shè)置時(shí)長(zhǎng),stringRedisTemplate.opsForValue().setIfAbsent()。合并成一個(gè)原子操作。

  這樣寫(xiě)的化問(wèn)題還是有的,假如你設(shè)置超時(shí)時(shí)刻為10秒,而我履行事務(wù)代碼為小于10秒,還沒(méi)履行完,就把鎖釋放掉了。高并發(fā)場(chǎng)景下你不能決議履行順序.

  能夠不能夠自己加的鎖,自己刪去,別的線程不能進(jìn)行操作?
  咱們給每個(gè)線程設(shè)置一個(gè)uuid,唯一id。這樣輕輕松松解決了。
  商場(chǎng)上面現(xiàn)已有許多許多成熟的結(jié)構(gòu),咱們能夠不需要去手寫(xiě)分布式結(jié)構(gòu)來(lái)完成。

到此這篇關(guān)于淺談Java分布式架構(gòu)下如何實(shí)現(xiàn)分布式鎖的文章就介紹到這了,更多相關(guān)Java分布式架構(gòu)  分布式鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot結(jié)合Redis實(shí)現(xiàn)序列化的方法詳解

    SpringBoot結(jié)合Redis實(shí)現(xiàn)序列化的方法詳解

    Spring提供了一個(gè)RedisTemplate來(lái)進(jìn)行對(duì)Redis的操作,但是RedisTemplate默認(rèn)配置的是使用Java本機(jī)序列化。如果要對(duì)對(duì)象操作,就不是那么的方便。所以本文為大家介紹了另一種SpringBoot結(jié)合Redis實(shí)現(xiàn)序列化的方法,需要的可以參考一下
    2022-06-06
  • 一篇文章帶你詳解Spring的AOP

    一篇文章帶你詳解Spring的AOP

    這篇文章主要為大家介紹了Spring的AOP,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Java按行讀取文件文本內(nèi)容的方式匯總

    Java按行讀取文件文本內(nèi)容的方式匯總

    在工作和學(xué)習(xí)中,有時(shí)候會(huì)有一些場(chǎng)景,代碼需要配合讀取文件來(lái)執(zhí)行,比如:讀文件數(shù)據(jù),來(lái)進(jìn)行計(jì)算、組裝SQL、更新操作,本文給大家介紹在Java中按行讀取文件文件內(nèi)容的方式有哪些,感興趣的朋友一起看看吧
    2023-10-10
  • 詳解關(guān)于SpringBoot的外部化配置使用記錄

    詳解關(guān)于SpringBoot的外部化配置使用記錄

    這篇文章主要介紹了詳解關(guān)于SpringBoot的外部化配置使用記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java中的CountDownLatch簡(jiǎn)單理解

    Java中的CountDownLatch簡(jiǎn)單理解

    這篇文章主要介紹了Java中的CountDownLatch簡(jiǎn)單理解,CountDownLatch是一個(gè)同步工具類,用來(lái)攜調(diào)多個(gè)線程之間的同步,它是是使用一個(gè)計(jì)數(shù)器進(jìn)行實(shí)現(xiàn)的,計(jì)數(shù)器初始值為線程數(shù)量,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于Java中static關(guān)鍵字的用法

    關(guān)于Java中static關(guān)鍵字的用法

    這篇文章主要介紹了關(guān)于Java中static關(guān)鍵字的用法,static:意為靜態(tài)的,在?Java?里面作為靜態(tài)修飾符,可以理解為全局的意思,static?不僅可以修飾成員變量,成員方法,還可以修飾代碼塊,需要的朋友可以參考下
    2023-08-08
  • Java中如何實(shí)現(xiàn)不可變Map詳解

    Java中如何實(shí)現(xiàn)不可變Map詳解

    這篇文章主要給大家介紹了關(guān)于Java中如何實(shí)現(xiàn)不可變Map的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作工具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):線性表

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):線性表

    這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-07-07
  • SWT JFace 拖曳效果

    SWT JFace 拖曳效果

    SWT(JFace)體驗(yàn)之拖曳效果
    2009-06-06
  • 微信js-sdk+JAVA實(shí)現(xiàn)“分享到朋友圈”和“發(fā)送給朋友”功能詳解

    微信js-sdk+JAVA實(shí)現(xiàn)“分享到朋友圈”和“發(fā)送給朋友”功能詳解

    本文分享了微信js-sdk+JAVA實(shí)現(xiàn)“分享到朋友圈”和“發(fā)送給朋友”功能介紹,大家可以參考一下
    2018-03-03

最新評(píng)論