00:00
好,我们来去看一下怎么用代码来去实现我们的自动续期。那么可以找到我们的分布式锁,那么一旦我们加锁成功之后呀,我们就应该去自动去切啊,那么加锁呢,就是吹lock这个方法,我们加人锁范围之前停掉一自动水气。那么这个自动续期啊,还是比较麻烦的啊,所以呢,咱可以去封装成一个方法,那将来我一调这个方法就可以了。那么回到这个下面这个位置,我可以来一个什么私有横法。啊,不的。然后来一个renew X per啊,嗯,这个方法,那自动续集方法。那么这个方法呢,咱最核心的啊,就是一个瓦脚本等,先把这个瓦脚本呢,给它定义出来script,等于咱把这落脚呗,直接拷背一下。然后呢,放在我们这个里面去,那放进去之后呢,我们可以去看一下啊,换一下行。
01:01
那比如说呢,如果他。啊,它的所存在,我们则自动则重置过期时间。然后返回值是一,如果不是自己的所,我们就返回一个零,代表呢。他的锁,自己的锁已经不存在了,可能已经释放掉了。所以已经释放掉了,那咱要去取消我们的定时器。那我们啊,这个的话就需要定时器啊,定时器来一个new一个time。点上,然后呢,铁。这样的一个东西,那么new,一个timer task。那么咱应该是每隔1/3的过期时间。那么过期时间呢,咱前面应该要写过啊。那么我们比如说呢,每隔1/3的过期时间,我去重置一下。那么应该是啊,一。啊,或者呢,我们应该是z.XPI。那么然后除以一个三,每隔1/3的国际时间啊。
02:05
所以我们之前的过节时间是以秒为单位的,那这个地方是毫秒为单位的,所以呢,我就要去乘以一个。1000啊,那个1/3的过期时间来去重置一下。啊,这是延迟时间啊,这延迟时间,那你也可以每隔1/3的过期时间来以重置,把它给拷贝过来,然后呢,放在那么这个地方。啊,定时器呢,我们就这样的一个东西,那我们要注意每隔1/3的布局时间。来去执行我们这个脚本,那么执行脚本呢,我们应该是瑞四碳排点上。然后是excute new,一个deate ready script,把script的放进去,那最终我就返回一个不里的值就可以了。如果为to代表自动续期已经成功了啊,如为false代表呢,自动续期已经失败了啊,那么它里面呢,K列表,那么K列表上应该只有一个是lock锁的名称,那咱应该有一个lock name这样的一个玩意儿。
03:09
那么它应该有呢,有我们的UUID啊,以及过期时间啊,UID啊,我们也可以给它放进去,我们好像是那个线程ID啊。呃,UID加线程ID应该是这个get塔ID啊,来一个get ID。然后过年时间呢,咱们应该是Z点,那是X。Exp,咱们不应该是this点啊,This点啊,This指这个匿名内部类的对吧啊。那么这个P呢,在外面啊等应该是一个XP。那应该是个string类型的啊,它变成一个字符块,来一个string,点上value of,把这个CE它放进去。好,那么这样呢,它可以执行这个拉脚本啊,点上的是if判断。如果等于处的话,代表同志已经成功了啊。
04:01
哎,如果为false,代表已经重置失败了,自己的锁已经不存在了。那如果重置成功的情况下。哎,咱应该怎么样呢?或者说如果重置失败的情况下,咱应该怎么样,重置失败说明自己的所已经不存在了呀,我们应该取消定时任务。如果重置成功了,我们要继续。嗯,想取消呢,可能会比较麻烦啊,那如果我可以这样写。我每隔三分,我延迟1/3 1/3的过期时间,可以执行这样一个定时任务啊。我把那个周期时间给去掉了,这是一个一次性的定损任务,延迟1/3的过期时间执行一次。那么然后来去重置过期时间。重置好了之后呢,如果重置成功了,说明自己的锁还存在。那我可以。我可以再去执行这个renew。再执行U是,那它就就会怎么样,是又会开启一个定时器啊,对吧?啊,那1/3的过去时间之后呢,又会重置,一旦重置成功的情况下,然后呢,我继继续开启一个定时任务。
05:06
加来一重置,再一重置1/3的过去时,最后再一重置,这样子一直重置啊。那么知道什么为止?那么知道啊,知道知道咱们这个,呃,续集成续习失败了。说明自由色已经不存在了,它会取消,就不再去执行这个地离方法了啊,就不再去续期了。哎,那我连取消都不用去取取消了。啊,就更方便了,对吧,啊。好,那么也就是说呢,我们这个加锁成功的情况下啊。我们可以呢,来一个类似点,但是renew renew。Re PI来重置过期时间啊,这个地方,那么加锁成功,来去成功,然后呢,返回之前来去自动开启定时器,来去自动自动续期。
06:04
好,那我们这样呢,咱这个就就已经写好了啊。如果你不这样写的话,那么也可以,你可以在哪里呢?在解锁的时候。如果这个解锁的反应结果集是一的情况下,它不就解锁解锁成功了嘛,对吧?啊解锁成功了,这成果就取消也是可以的。那只是呢,没我们这样写的灵活哈,你还得去取消就比较麻烦。好,是咱们这样的一个写法啊,这种写法呢,我觉得会更好一点啊。那么写好之后呢,我们来去测一下,看能不能给我自动续期呢。那比如说呢,我们这个减库存这个方法啊,咱回到一开始这个方法里面去啊,抵达这个方法里面去,那我们呢,来可能来一个啊税来一个是或者说来一个time,然后是unit.second点上sleep,我就睡一个。啊,1000秒。睡个1000秒,那么有一场呢,我就来一个K。
07:02
那睡一下我这个业务逻辑呢,需要1000秒才能执行完。登录我的锁的过机时间啊,我们指弹系统是默认的过期时间30秒啊。30秒之后呢,自动自动过去,但业务逻辑没有执行完了呀。他应该会怎么样,应该会一直自动续期。好,那就重新启动咱们这两个服务啊。重心起到。啊,启动好之后呢,我们来去刷新一下。啊,咱这任务呢,一直执行不完。但是我们的锁呀,他应该是获取到了啊,来看我刷新一下,你锁呢是22秒,还有21秒,20秒19秒,诶18秒有没有续期啊。哎,没有续期。啊,居然没有续期啊。我们来看一下什么原因啊。为啥没有续期呢?呃,找到我们那个自动续期那个代码,那说明咱代码呢写的有问题啊好,问题呢就出在get ID这个位置。
08:02
那么get塔ID要注意了,它怎么实现的?咱们是通过UUID啊,是相当于服务的唯一标识啊,加上当前线程的V标识,当前线程的V标识。那对于我们这个定时器来说,它是相当于开了一个子线程。那么时刻监听监听我们主线清里面那个锁,然后给它呢来个自动续气。其实我们是这样子的啊,咱们应该是一个请求过来,先到达我们的tomcat线程池来去获取一个线程,然后呢,可以处理我们的业务逻辑。在处理业务逻辑的过程中,我们会加锁,然后呢会解锁。那么加完锁之后呀,我们又开启一个定时器。这样的一个子线程来监听我们的锁,如果这个锁呢,咱业务逻辑没有执行完,我们的锁呢,是不能过期的,我们要给它自动续期。那我们在这个定时器内部get塔ID,然后通过瑞的点,看瑞获取的是谁呢?获取子线程的这样的一个唯一标识。
09:12
也就是说,我们在给这个子线程的微标识子线程。得锁了一自动续期,那么子线程有锁吗?没有锁,我们要给主线程的锁了一自动续期啊,那你要get塔ID呢?获取的是子线程的唯一标识了。那于是呢,咱自动续期就没有生效。那么可以去演示一下,看看是不是这样子的啊。那我们呢,呃,可以,嗯,Debug重新去启动一下啊,那么debug。重新启动。好启动好之后呢,我们来去看一下这个最终效果搬到这边来嘛。大家来看一下啊,我们来去访问一下我们这个服务啊,由于呢太长时间没有响应,所以N这个呢,已经报我们超时了啊。
10:06
好,那我们应该有咱的这个锁了,打开这在那客户端我们可以看到有30这个线程的一个锁,还剩20多秒的过去时间。那么我们这个自动续期它应该会走的啊。应该会走到,哎,刚才忘了打断你了。不知道还能不能再走一下啊?好,我们来去看一下这个怎么样,哎,所已经没有了,对啊,也没有了,没有的情况下,咱可以这样子,我们可以再去发一个请求啊,那再发一求,他应该会续期一次啊,发现自己的水已经没不存在了,所以就不再续期了啊。好,我们这里呢,来去看一下。还剩20秒,你20秒的情况下,它就做我这个定时任务了,定时器了,那么此时跟塔ad的值多少呢?你是哪个值,54这个线程。54这个线程锁了一次,给他的一次统计期,但是我真正这个锁的线程唯一标志多少是31。
11:05
是31这个线程,这主线程啊,那么子线程定时七这个线程呢,是54,它在给自己都锁了一次动矩行了两个线程唯一标识呢,对不上。好,那就在塔A1这个地方呢,出问题了啊。那咋办呢?我们都要去改一改我们代码了。那我们可以发现啊,咱们这个代码呀,其实坑还是比较多的啊,那边做呢边去完善。那我们呢,就不应该再这样子去。去去去做了啊。咱可以呢,把这个代码给它放哪里去呢,放到。放到这个各档功法里面去。啊,我们呢,可以给它放在比如说。那这个位置啊,UID,我直接给它拼好,复制给这个UID不就行了吗。那这样的话,我们这个UID啊,就是一个拼号服务IP和当前线程ID的一个。一个标识了,一个为标识了,那下来呢,我在用的时候呀,咱也不用通过这个方法来用了啊把这个方法呢给它去掉。
12:08
要删掉,再也没有这个方法了,然后全部啊,全部通通的替换成那么这个UUID,这是拼好的一个UID啊。好,那么然后这个地方呢,再给它替换掉,替换成UUID。然后呢,最后呢,咱们这个位置呀,也替换成什么UUID。啊,这个呢,肯定是不会变了啊。啊,因为呢,这个UID是主线程来获取锁的时候就已经赋好值了。啊,就不会再变了,好,我们再来去重新启动一下。咱们这两个服务。来重新启动,此时呢,大家可以run启动了啊。啊,应该就没啥问题了,我们可以去试一下。那两个服务呢,我们也都已经启动好了,那么启动好的情况下,我们来去刷新啊,来看我们这个锁啊。
13:06
有没有这个锁呢?已经有了。啊是27这个线程,那么过低时间啊,还有24秒,23秒22秒20秒19秒连续期了。啊,它可能会有点误差啊,但是不影响啊,OK,那我们再来走一下。呃,还剩20秒的时候,19秒这又自动续期了啊,他会给我们自动续期。那自动续期呢,我们就已经实现了啊。那么实现过之后呢,我们一定要在高并发情况下来去看一下这个效果。好,咱们呢,来把我们这个税呀,给它解开啊。给它去掉啊,应该它去掉啊,去掉之后呢,我们来去重新启动咱们这两个服务。好,来看这个高并发情况下会不会出什么问题啊。OK,咱已经重启好了。重建好之后呢,咱们来去把库存给它改成5000件库存。
14:08
5000件库存改好之后呢,我们来去找到压力测试工具,把这一块呢全部给它清掉,我们来去运行压力测试。要我们这个性能呢,其实嗯,还是非常不错的啊。600左右的性能,我还没有预热的情况下,如果预热情况应该是可以达到600多的啊。那么此时库存有没有减为零呢?也已经减为零了。既可以做到供续期,又可以做到可重入,然后呢,又可以保证我们的并发安全性。那我们这个锁呢,就是一个比较健全的啊。比较完善的一个锁啊。
我来说两句