00:00
那么最终呢,我们就借助于哈希数据模型,结合罗脚本来去实现了分布式锁。可重入的分布式所。那我们还有最后一个问题,就是自动续期,那么自动续期该如何去实现呢?我们也需要去分析一下了啊,自动去膝盖如何去实现。那比如说呢,我30秒的过期时间,那么30秒的可能业务逻辑还没有执行完呢,如果没有执行完的情况下,那它应该过期吗?不应该。那否则的话呢,咱剩下的业务逻辑就裸奔了啊。那么怎么让它自动取气呢?我们可以呢,每隔一段时间来检查一下。是不是快过期了?然后呢,如果快过期了,我们来去续期呀。每隔一段时间要检查一下。那我们就需要什么呢?就需要定时任务。啊定任务,那么它明显是一种时间驱动啊,每隔一段时间我要执行一次,那比如说呢,我们要出周报,要出月报,那每周我要执行一次,每个月要执行一次,它是是一种时间驱动啊。
01:12
那我们这里的话也是一样,我可以每隔一段时间,我检查一下我的锁呢,是不是快过期了,如果快过期了,那我可以进行重置过期时间。啊,那么结合咱们的lua脚本来去实现啊,为什么要结合lur脚本呢?因为我在续期的时候还需要去判断是不是自己的锁,我不能说上去就续期。如果这个log锁属于我,我才能去续集。那么判断,然后续期是我的时候我才能续期,那为了保证原子性,咱很明显要使用软胶呗。啊,当然呢,咱这个定时任务呀,有同学我可以开启一个子线程,比如说呢,有同我可以去new一个是瑞。在这个threead里面啊,啊,Riad里面,我就可以开启一个roundable任务,对吧?啊roundable任务。
02:03
那这个任务里面。那咱就可以呢,比如说我每睡1/3的,咱可以来一个red点上的sleep。那我可以每睡1/3的这个过期时间。然后呢,我就起来检查一下,来执行那个打胶呗,先检查一下我的锁是否存在。啊,如果我的所存在,我就重置一下这个过期时间。重新设置一下。过去时间,哎,能不能做到呢,也可以去做到啊。每隔1/3的这样的一个时间啊,他就起来呢,干一下活,检查一下是不是过期了,那你肯定有一个呢,有一个循环啊。我有处这样的一个循环。好,那么如果自己的锁不存在呢?我就退出循环就可以了。甚至你使用一个子线程也是可以去做的啊。也没啥问题。好,那么具体使用哪种方式?
03:00
啊,其实不太讲究啊,那我们这个的话呢,我打算使用定时任务。那么定时任务呢?其实又有很多种实现了啊。啊,比如说呢。那我们在doc里面讲过那个定时人物。那我们在spring里面,那么也讲过一些定时任务。那我们呢,还学过一些专业的,可能还学还接触过一些专业的定时任务框架,比如说呢。那再比如说呢,还可能接触过一些分布式的定时人物,什么叉叉和碉堡。啊,或者说以as job啊,那这一定是人物。那么这些定时任务,哎,咱怎么去选择呢。我们都不去选择啊,因为他们在这里呢,都不是很好用。那比上四本定是。那我将来我的工程里面都不知道有多少个锁啊,那我有锁行的,有有锁咱们这个库存的。可能有锁一些呢,呃,防反反轮击穿的啊。
04:03
那缓能击穿呢?可能也有很多地方都要防止缓成击穿,可能有很多分不遮锁,那我这里面要有多少个死人定时人物呢?你搞不清楚了。那么Co他常要碉堡拉胶堡都是一样,你搞不清楚你有多少个顶人物。然后呢,哎,我比如说我这个锁已经释放掉了。那么定时任务怎么停掉呢?虽然控制起来不是那么灵活。那么doc里面定时任务呢?哎,我们可以通过限定池。I控制我们的线程数,它这个有个定时任务线程值啊,可以控制线程数。但是呢,你不太好控制每一个定时人物啊,因为它是一个线形词来去承担的。好,那我们现在的话呢,啊,可以呢,简单的去演示一下这些呢,不用去演示了,肯定是不合适的。那么guc里面定时人物,那么要玩它的话,咱们可以呢,呃,简单的写一下这个写一个脉风法哈,来看一下啊,来一个这个是慢。
05:04
方法在那方法里面,比如说呢,我可以通过这个exec excuses。啊,这是一个线程池的工具类。因为它可以呢,初始化一个定时任务的这个线程池啊,当然呢,在实际开发中不太推荐使用这个线程池工具的一个初始化线程池啊,因为呢,它可能会导致内存溢出。那具体为什么导致内存溢出我们这里呢?不想再解释了,因为在GUUC专题里面应该有说明啊,咱都有说明。啊,在阿里巴巴的手册里面,开发手册里面在国内也是比较权威啊。啊,他就不推荐使用这样的一个工具类,那我们现在就随便演示一下,所以呢,我就去用一下啊。啊,这初始化方式呢,咱应该是通过构造方法来初始化,不应该使用这个工具类来初始化啊,那我这边就随便来写一写,来一个scheduleingcu service点上那就可以呢,开启一个定时任务了。
06:03
那么这个任务呢,我们可以呃,使用这个4k do fix right啊,这应该是最常见的一个方法了啊。那么第一个呢,参数呢是一个roundable任,那么roundab呀,它是一个呃,函数式接口啊。而且是午餐的一个函数式接口,你可以来一个简读函数。啊,然后呢,第二个参数呀,呃,它是什么东西呢。它需要一个延迟时间,初始延迟时间,比如咱就延迟一个五秒钟,每隔十秒钟执行一次,让时间单位是time unit,点四。啊,定时任务这一块呢啊,我打算后续再出一个定时任务的专题哈。那么敬请关注对吧?啊,OK,敬请期待。啊,那这个的话呢,咱们只是简单的去看一看啊。好,那么在这里我们可以输出一下咱们定时任务的打印值啊,这是定时任务的执行执行时间,来加上我们系统当天时间,来个system,点上time minutes。
07:08
好,那么这是打印咱任务的执行时间啊,咱可以打印一个任务初始时间,来一个ex out,这是定时任务初始时间来去加上是C点上ten ten minutes。好,那么这样呢,我们就已经写好了,那么写好之后呢,我们可以去看一下啊,你第一次执行它会怎么样呢。它会隔一个五秒钟。那么以后呢,是每隔十秒钟进行一次啊啊延迟时间。因为第一次呢,它是间隔了五秒钟,你三五到四零嘛。间隔了五秒钟,那么以后呢?每隔十秒钟进行一次。好,我们来看啊,你看十秒钟执行一次。好,咱就研究出来了啊。那么延出来之后呢,我们来看,如果我使用duc里面这个定时人工线程池可以自动续期的话。
08:00
那比如说呢,我这个锁我已经释放掉了,那锁释放掉了之后呢,我怎么取消这个定时功能。怎么取消呢?那你只能怎么办呢?只能把整个定时任务线程池。给他,你有取消定人物的这样的一个方法吗?只有开启定时任务的啊。那有没有销毁的,有没有停止的,因为只有这个下的大,所以把整个定时任务线程池给销毁。你下档都停掉,这是立马停掉啊,那这是提交,这是线程词的方法,提交任务的一个方法,因为定时任务线程词啊,本身也是个线程词啊。是线程向线程池提交一个普通任务的一个方法。OK,那么呃,你看他没有这个停止任务的一个方法啊。没想停掉,那就很麻烦了。所以呢,我们这个doc里面的定时V啊,也很垃圾啊,不好用。那咋办呢?我们可以使用的,使用这样的一个东西啊,使用咱们,嗯,Java u给我们提供的一个timer定时器,有timer定器啊,你这是加va u提供的啊,还非常的简单的一个东西,咱可以去你一个,但是。
09:16
Time。定时器,然后点上它里面就有这个KU这样的一个方法,你还有什么取消定时器的一个方法啊。他都有。那控制起来呢,就会更加方便。那我们也可以开启个定时任务,你看这个任务呢,延迟多长时间,能间隔多长时间。嗯,它就很好用。那么这套呢,我们来去玩一下啊,第一个参数它需要一个啊,需要一个T猫task这样的一个参数,你们可以去另一个,然后T猫task。然后呢,咱们后面的参数呀,它有啊,我们的延迟时间和间隔时间啊,那么延迟我可以延迟一个五秒钟,那注意时间单位前这个时间单位是什么呢?你们可以去看一下啊,这个单位是什么,咱点进去。
10:07
看这个有一个带时间的一个东西啊呃,找到对应的一个方法,咱们再回去啊。不是这个咱可以呢,先写上去啊,那这个时间呢,比如是十秒钟,我写个1万,先写一个啊,其实单位呢就是毫秒,我写这个是对的啊,延迟五秒钟,每隔十秒进行一次。那么时间单位呢?它这里有说明,应该是毫秒值。延时时间单位和间隔周期时间单位都是毫秒。那么延迟五秒,每隔十秒钟执行一次。那么在这个中间呢,我们也可以去输出一下。输出一下,好,这是咱定时任务,定时任务定时任务的执行时间,那么来去加上我们这个system,点上time minutes。
11:00
然后呢,我们再去输出一下它的初始时间是什么时间,给它放在这个位置,好自然的这个初始时间。好,我们来去运行看一下这个效果哈,我们来走。啊,初始时间呢是七三,第一次执行是间隔五秒钟,所以呢是七八。那么以后呢,每隔十秒钟,这一次应该是8898这样子。好,来看。那八八,然后是九八。好,这是咱们这个,嗯,定时器啊,所以呢,我们决定呢,使用定时器来去做咱们这这个事情啊,使用这个timer定时器工具啊,来做这个定时任务,定时去定时去器。那么到时候呢,我就可以延迟1/3,比如1/3或者是2/3的过期时间啊,1/3或者说是2/3的过期时间。
12:02
那我来执行,那每隔1/3或者说是2/3的过期时间,那我来自动续期一次。来检查一下自动水气。那么如果所已经不存在了,我就可以取消这个定时窝啊。啊,是咱总体思路。好,那么我们这个定时任务我们已经确定好了使用探马定时器,那么落脚本又该怎么去写呢?我怎么自动聚集呢?啊,那么其实这个辣胶粉啊,实验思路很简单,我们要判断自己的所是否存在,咱通过什么来去判断呢?但题已经演示过了啊,我就我这里就直接写啊HX这个指令啊,它就可以判断锁是否存在,并且是不是自己的锁。他都可以判断出来。那么如果存在,如果存在,那么则自动则续期对吧?啊则重置,重置过期时间就可以了,那这个乱这面写起来就很简单了啊,你来一个if判断来ready点上扣,那我们这个里面啊,应该是一个H这个的意思。
13:15
然后呢,咱要去判断这个所是否存在,应该是一个lock加上一个UID,然后呢,是不是等于一,如果等于一,说明我的所存在,这就是我的所啊。好,那咱可以重置过期时间那个ready点上扣。然后重置过期时间呢,应该是执行这个P这个指令,然后呢给我们的lock锁,然后重置一个过期时间,比如重置重置为30秒的过期时间。那么重置成功之后呢?呃,咱可以成一个,比如重置成功咱可以成一个一,那么XPI指令它本身有没有什么反应值呢?我们可以去看一下啊,比如来一个site,这是K1,那是V1,我给这K1啊设计个过籍时间啊,来is p,那是K1。
14:03
比如30秒的过去时间,我就回车,诶,它会返回一个一,一旦设置成功了,它就返回一个一啊这样子。好,那比如说这个TTL还剩多长时间呢?那TTL,然后来一个T1还剩多长时间呢?还是21秒。那么还剩不到20秒了,我再进行这个P这个指令,它就会重置搏击时间啊,那么现在还剩多长时间呢?还剩27秒。你每次执行这个AP指令的时候,它都会重置一次啊。那就可以直接去ta X p直性的反应值就行了。那么原来是这个A,然后是ta,然后零,最后呢是end。好,那么咱这个瓦脚本呢,也就解决了它自动续期呢,定时任务咱已经考虑到了,瓦脚本呢,已经写好了。那么代码实现呢,就更加简单了呀,那么这拉脚本写的对不对,咱先去测试一下啊,言谨其间的话,当然呢,咱这里面还有一些参数呢,我们要去分析一下,好来看有那些K参数,K参数呢,咱应该有个log参数,那么二个参数呀,我们也有两个,一个是UID,那么一个是XQ过去时间对吧啊。
15:17
好,那么这个呢,咱给它替换成我们的,呃,T,然后是一下边是一的。那么然后下面这个地方呢,也是一样,也应该替换成K等于一了。好,那么这个位置呢,来给它替换成这个R个位,然后是一的啊,那么这个地方呢,给它替换成R个位。然后是二了。好,但是脚本呢,就算是嗯,写好了再给它放到一行上面去。到我们的里面先去试一下啊。先去试一下,呃,放在一行之后呢,我们给它拷贝一下啊。打开red客户端,来一个eva指令,那么咱把这个辣脚本往里面一放,然后咱有几个K呢,一个K啊,就叫lock u ID呢,我可以随便写个UID啊,然后呢,来一个30秒的录取时间。
16:11
现在我这个锁存在吗?肯定不存在,我连log锁都没有哈,那就重置个过期时间,已经失败了。那么如果自己的所存在呢?比如我来一个setlo,然UID我可以写一个啊,随便写一个。啊,给它放进去。啊,那么然后呢,我们应该是H赛了,对吧?啊,来一个H啊。然后log。然后那个设置为,比如说设置为三,我重录了三次。那么此时呀,这个锁呢,它应该是没有过期时间的啊,应该是负一。那我来去使用辣脚本给他设计一下国际时间。那么这UID呢,应该是一样的,我一会一车间设置成功了,此时过滤时间多长时间呢?是二十七二十七秒。然后呢,啊,还有多长时间呢。
17:01
还剩20秒不到20秒了,那我们来去。再重置一次,那么再重置一次,它会回到你28秒,回到30秒。啊,这样子。啊,每一次去经这个罗脚本的时候,就会重置过期时间了啊。
我来说两句