国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:29日期:2022-08-28 11:54:29

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

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

 @RestController@Slf4jpublicclassIndexController{@AutowiredprivateRedissonredission;@AutowiredprivateStringRedisTemplatestringRedisTemplate;@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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 九九久久精品这里久久网 | 北条麻妃在线一区二区 | 99手机在线视频 | 亚洲精品国产一区二区三区四区 | 国产在线极品 | 波多久久夜色精品国产 | 成人国产精品999视频 | 日韩午夜在线观看 | 91精品一区二区三区在线播放 | 91理论片| 三级国产三级在线 | 日韩一区二区三区在线观看 | 成人国产免费 | 久久99久久精品国产只有 | 天天激情站 | 亚洲精品国产综合一线久久 | 成人高清在线观看播放 | 国产精品v免费视频 | 亚洲性在线 | 美女扒开腿让男生桶爽网站 | 国产成人精品免费视频大全五级 | 福利片成人午夜在线 | 亚洲2020天天堂在线观看 | 精品玖玖玖视频在线观看 | 亚洲精品中文一区不卡 | 老司机免费福利午夜入口ae58 | 久久免费毛片 | 欧美精品一区二区三区四区 | 日本经典在线三级视频 | 九九精彩视频在线观看视频 | 99热久久精品国产 | 午夜欧美成人香蕉剧场 | 久久亚洲国产的中文 | 欧美69xx | 欧美精品久久一区二区三区 | 久久99毛片免费观看不卡 | 亚洲成a人在线播放www | 黄色网址在线免费看 | 99国产精品九九视频免费看 | 国产精品黄网站免费观看 | 三级中文字幕永久在线视频 |