00:00
指令分析完之后呢,我们来去看一下代码该如何去写。那么打开我们的ID。那我们可以找到咱减库存的方法,那我依然在这个方法的基础上来进行改造,咱可以呢,把这个方法呢,保留一下啊,拷贝出来,然后呢,放在啊这个位置。那么这个方法咱给他重命名一下,得重命名为五这个方法了,那么然后呢,再回到这个方法里面去。那么咱之前呢啊,用乐观锁改造过啊,咱重新还原到最开始那种状态。最开始呢,我们就查询库存。那么查询完库存之后,我们开始判断库存是否充足。然后呢,来去扣减库存就可以了,那么像这个moty啊,以及咱背后的这个咱都不需要了啊,就删掉,那么像这个东西呢,它也是一个也是都是多余的,都给它通通删掉。那么删掉之后啊,我们这个operations要替换成ready烫,给它放在这个位置啊,放在这个位置。
01:02
好来给它,嗯,稍微格式化一下。那么格式化好之后呀,我们来去重新启动一下,要保证我们这个代码呢,还原的没有问题。好,来重新启动我们的第一个服。然后重启我们的,呃,第二个服务啊。第二个服务,那么重启好之后呢,我们打开我们的浏览器,我来去访问一下。好,到底有没有防问成功呢?那他没有报错,我应该就会成功了,大家可以设置一下这个库存去看一看啊,来一个set stock,咱们是5000 OK,那么设置好之后呢,我来去啊刷新,好来看这个库存有没有扣减啊,来一个get stock,那么还剩4999件,那说明了已经扣减了。那我重新给它设置回5000,我来去压力测试一下,看看它会不会出现窗外现象,好把这个呢,咱给它清空掉啊好,我们来去运行压力测试。
02:01
那么此时呢,它的并发量是非常高的,大概可以达到3000多的并发量啊。好,那我们来去啊,看一下咱的最终数据啊,怎么样,那么诶咱这里啊写错了对吧,你可以呢,再来去运行一下啊,重新把这个清空掉,来去运行。你看3000多的并发量啊。那我们来看这个最终的值是多少,来一个电子指令,它值呢是3810多。那么这个呢,并发性问题非常突出。那我们来去啊,加上我们的锁,我们要在方法执行啊,开始的时候来去加锁啊,在这个地方来做加锁操作。那么在方法结束之前,咱应该是在finally里面,那么来进行解锁,咱们应该来一个track量的是。Finally里面的解锁,那么这个解锁呢,咱应该是啊,怎么解呢,咱也要去看一下怎么一解锁了啊。
03:02
那么回到这个代码里面去,那么加锁呀,我们应该是执行set X这个指令,咱之前分析过啊,我们要通过set n X来去获取所。好,那我们这个位置呀,咱们要去执行这个set指令,那么有没有对应的方法呢。来一个V字,点ready碳点上。然后呢啊,咱应该是open for me点上,但是set。那有没有SX呢?你发现了没有对应的方法啊,只有S方法。那么啊,虽然没有set NX啊,但还有一个对应方法,这是方法名呢,不叫set NX,这它叫set OB。那么set of呀,它跟这个present呢是相反的。那我们都知道是存在的意思啊,哎,如果存在我就设置。好,那么absent什么意思呢?是如果不存在,那么我可以设置它俩是相反的啊。
04:07
那我们的X。是怎么回事来着,是如果不存在我设置呀,对吧,是这个意思是咱应该使用什么呢?使用set if ofent来使用这个方法。啊,来去来去做到X这个效果。好,那我们呢,来选择这个方法就可以了,那么K,比如说咱就可以起一个log锁。那么Y6呢,咱都无所谓,咱可以随便取一个,比如你随便写个一一。好,那么然后呢,最终返回的爱是什么呢?是咱们这样的一个lock。哎,他这个lock它是一个布尔类型的啊。因为在我们的里面,它返回值是一和零,对吧,是一和零,执行成功了就是一,执行失败的就是零。啊,对应在Java里面的是布尔类型。啊,是true和false。
05:01
如果是true,代表霍居所成功了,如果是false,代表霍居所失败了啊。好,那么这个地方呢,咱们就可以去判断一下了,来一个if判断啊,如果这个log所获取失败了,那么咱们应该怎么样呢?我们应该去重试。啊,咱可以调好呢,调类似点抵达的方法,调自己的方法来进行重置。那么你最好呢,是睡一会再用公式啊,以避免出现占内存溢出来一个离啊,比如说我就睡一个啊,50毫秒。那么有异常咱们可以来一个try catch啊处理一下。好,那么然后呢,咱这重试我们就做到了啊,如果霍金锁失败,咱们第三个操作呢,就是重试操作。重试,那重试嘛,咱这一次中含呢,使用的是地归。啊,递归啊,调用啊。啊,DV调用。
06:01
好,那么然后呢,我们如果获利锁成功了,来执行这个业务操作,最后在finally里面可以解锁。那么应该是this.ready temp,点上object for value,哎,不需要这个object for value,直接delete就可以了啊,直接delete。那可以把这个log锁呢删掉就可以了,可以这样写吗?好,那么写好之后,那我的代码写的。那有没有什么问题呢?那有没有什么问题呢?好,那我们可能去。分析一下啊,咱可以去分析一下有没有什么问题。那其实这个代码呢,写的是非常有问题的啊,哎,表面看上去啊,感觉好像天衣无缝,但其实呢,漏洞百出啊。为什么漏洞百出呢?来咱仔细去看一看啊,比如说呢,我第一次啊,第一次我一个请求过来了,第一次执行这个迭代的方法,它会怎么样。他会在我们的gbm站里面。
07:02
啊,入一个在我们的这个基本母站里面来入一个dedu这样的一个方法,对吧?啊dedu。这样的一个站,比如迪拉特一这样的一个站,它已经入进去了。那么然后呢?霍金锁呢?可能很不巧,霍金所失败了。那霍许锁失败之后呢,他会走到我们这个if里面去了,让他睡一个50毫秒,起来之后呢,啊,又入了一个什么,又入了一个自己这个方法。啊,到站里面。那么紧接着又会入一个。D doctor。第一个二这样的一个方法啊。这个方法,那我们知道方法的执行呢,其实就是一个入站,那么出站的过程。然后调用的时候呢,它会入战。那么然后呢,标用完了会出战啊。那么战争啊,上面这个战,这个战争一啊,战争一刚才执行到这个位置。进到这个位置啊,进到这个位置了。
08:02
那么然后呢,战争二又是一个抵达克的方法,那么进来了,那么进来之后呢,很不幸啊,他呢,又获取所失败了。然后又睡了一个50毫秒之后呢,啊,又入了一个啥呢,又开始执行this点抵达的方法,于是呢,抵达的这个方法呀,又入了一个dedu。抵达三这样的一个战争。那么然后呢,底单二呀,也执行到这行代码啊。你说一和二都在我们这个地方阻塞着呢。那么紧接着呢,第三个战争啊,他进来之后呀,开始执行。啊,第三次从事了啊,哎,那么很开心,哎,他获一道锁了。那会掉锁之后呢,还会走到这里面去吗?不会,他立马是走菜这个位置了呀,对啊,执行业务操作执行完了就把锁给释放掉了。释放掉了。那么然后紧接着咱的咱的第三个战争,第三次执行这个抵押的方法是执行成功了呀,对啊。
09:05
那么执行成功之后呢,抵达了三这个领出战了。他就出站了,出站之后呢,然后抵达二继续执行。D2,刚才执行了哪个规则呢?这迪达塔二也直行到这个位置来,对啊,进行这个位置了,他从这个位置呢,继续往下执行。那么继续往下执行,又会执行到哪里去呢?又会执行到踹这个位置。就从这个位置往下直行啊,又进到T这个位置。那就会怎么样。是又去减一次这个库存啊啊,又去扣减一次库存。他这个出现这种情况啊。啊,那么于是呢,咱减完一次库存之后呀,要抵他的二呢,也就出战了啊。也就出战了,那么出站之后呢,然后抵达一刚才呢,也是直行到这个位置。那于是他还要从底他的一这个位置呢,继续往下执行。那么最后又会出现什么情况呢?咱们的库存又被扣减一次。
10:03
那么你重试几次,他就会多扣减几次啊这个地方。虽然代码上写的是有漏洞的。啊,这个呢,也是我们最常见的一个错误了啊,千万不要这么的写,我们要写什么呢?一定要加一个A,否则那么你的库存啊被减为。啊会减为啊会会出问题啊,可能会多减啊,如果你没有大于零的配置啊,这样的一个设置的话,会多扣减。好,我们把这个呢,给它放到这个。啊,上面去啊,放到上面去,放到use里面。那就对了。好,我们来去啊,重新启动一下,我们这两个服务来重新启动,那么还有呢,服务一我们也需要去。重新启动。好,那么启动好之后呢,我们来看一下,呃,应该启动了没有问题啊,没有问题之后呢,我们来去把SPA的值重新设置为5000。
11:02
授权5000之后呢,那我这里呢,先去在浏览器上访问一下,看能不能正常访问,诶一直卡在这里呢。爱,为什么呢?我们来看是什么原因卡在这里啊。应该执行完了呀。好,我这里呢,有一个log锁没释放掉。因为我之前演示的时候呀,我通过一个set in lock设置了一个锁。呃,没有把这个锁呢,你后续没有把这个锁给删掉了。我之前演示过呢,它删掉,删掉之后呢,我又再做了一次,但是我没有给它释放掉。导致呢,我们的线程啊,一直阻塞着。你现在为他已经发生思索了?现在应该大家怎么样手动删掉啊,把这个log说啊,哎,手动删掉之后呢,我这就可以放行了。这也是我们在做分支所的时候呢,最常见的一个问题了。有的同学在这边呢,去调试的时候呢,手动设置了一些锁,但是呢,忘了删掉了那个程序呢,就一直在这里锁着啊。
12:06
好,那么然后呢,我们来可以刷刷,我应该访问了几次呢?访问了三次了,那咱的库存数量应该变成4000,嗯,997啊来看一下。看一下4997没有问题。那没有问题之后呢,那我们通过压力测试工具,我可以去压一下啊,先你把库存呢还原到5000。然后呢,在我们的紧密的工具里面,可以压力测试一下来走。来看啊。要么拼吐量,比我们使用乐观锁呢,肯定要好很多啊。啊,也接近于哈呢,接近于我们MYSQLB端锁的一个性能了。一单5000的并发量吞吐量是550的吞吐量啊。已经都成功了,那么最后我们的库存数量是多少呢?来看一下。多少是零?这就没有问题了呀。
13:00
好,那我们的,嗯,分布式数啊,基于RA实现分布式数。那么等于简单的实现了啊。
我来说两句