00:00
来看一下keep分布式锁的第三个问题,那么现在呢,我们依然有一个问题呢没有解决啊,就是咱们这个锁呀,是不可重入的。那我们就想去实现一个可重入的IE报错,那该如何去实现呢?那么其实呢,实验思路呀,啊有两种,那么第一种实验思路呢,我们可以在节点的内容中,内容来自于记录服务器及线程信息。现名信息。但的话呢,我们还得要记录咱们这个重入信息啊,啊,应该是三个信息。啊,你是哪台服务器的这样的一个线程,那么然后呢,这台服务器的每个线程。那么以及呢,重入信息,你是啊入了一次呢,还是入了两次呢?啊,我们需要给他记录下来。好是咱们这个第一种啊思路,那我们加速的时候呀,我们首先来判断,那么咱当前这个节点中啊,对应的这个服务器及线程啊,它有没有锁。
01:08
那如果有锁的话,我们可以呢,拿到这个重复信息,然后对他呢进行加一操作就可以了。那咱解锁的时候呢,首先来判断一下这个重中信息,当前这台服务器这个线程对应的这个,呃,节点的这个重中信息,看呢是不是大于零。那如果大于零,我们要进行简易操作。那么减为零的时候呢,我们才能把这个低点呢给删掉。还有咱第一种做法啊,或者思路啊。那么第二种玩法呢?我们可以借助于red local啊来以实现。那么local啊,我们都知道它什么东西呢,是现成,它是现成的局部变量,局部变量它是现私有的啊,那每个线程呢,都有自己对应的logo。那相互之间呢,互不影响,那不管你是不同服务器啊,还是不同不同线程对吧,那它都是可以区分开的啊。
02:07
OK,那我们的可重入怎么回事呢?那么可重入呀,是同一线程。同一线程。呃,已经已经获取。过该锁的情况下啊。该锁的情况下,那么如果再次要获取该锁。那可重入呀,那就可重入。好,那我们呃,这块大家可以通过这个水local那么来记录啊,这个线程是不是获取过该锁了。然后记录它的宠物信息。那每获取一次锁呀,我进行加一操作,每减一次锁呢,我进行减一操作,那减为零的时候,那我就可以把这个锁呢给它释放掉了,那否则的话呢,单只减完一之后呢就可以了啊。啊,那么这样的话呢,我不会两种情况都去演示啊,那有机会的话呢,咱们可以呢,呃,再去演示第一种情况,那这样的话,咱就以第二种方式为例啊,来演示一下这些思路呢,都是一样的啊。
03:11
OK,那么第一种思路呢,稍微复杂一点,因为你需要给他的每台服务器。啊,那句初始化一个唯一标识。那比单在RA里面啊,Red那个分布所里面,我们做可重录的时候呀,就给每台服务器呢,在启动的时候分配了一个UID。那么线程里面呢,又有线程的唯一ID,唯一标识就线程ID嘛。那么然后再加入一个可重复信息就可以了。那么这种方式的话呢,略微复杂一点,那我们这块呢,就以死人了为例啊,来去看一下,如果我们要做可重容锁的话,那怎么去玩。那么所local呢就比较简单了,因为它本身的每个服务器的每个线程它都是不一样的,都是不一的,因为它是线程的具有变量,线程私有的,跟线程是绑定的啊。
04:00
啊,那么怎么玩呢?哎,首先呢,我们可以呢,在咱们的这个可重所里面啊啊来去初始化一个初始化一个local啊来一个呃一个final然local。好,那么这个呢,咱只要记录一下宠物信息就可以了,那就可以来个intake类型的。这样的一个泛型啊,这所local里面真正保存的数据类型啊,是引体类型的。那么让变量名称它叫local啊,你有一个local。好,那么创建好之后呀,那我们在获取锁的时候,那首先呢,我要判断一下在local里面是不是有了该信息了。那么如果已经有的话呢,我进行加一就可以了,那如果没有的话呢,我们才需要一创建节点,然后呢,可以阻塞火炬锁。好在这个通点节点之前啊,我们可以先判断一下,先判断是red local中呃,是否已经有锁了,哎,那么如果有锁,那么直接进行重入,也就是对咱们这个指压进行加一操作就可以了啊。
05:12
它是怎么判断呢?咱通过这个所谓local先去获取这个所得重复信息,那么拿这个重复信息之后呀,我们来判断一下这个重复信息,如果这个重复信息flagg让它不等于,那那说明什么?说明它之前已经获取过符号有这个重复信息了。啊,并且呢,有重复信息就一定有过有锁亡啊,不一定,他可能有过锁,但是呢,已经释放掉了。啊,然后已经变成有可能是已经变成零了,那变成零的情况下,那还能进行重复吗。肯定不能,如果你之前有过锁,但已经释放完了,释放完的情况下应该变成零了啊,变成零的情况下呢,那你要再来获取锁怎么办呢?你只能再去通过重点节点再去排队了啊。
06:00
再去排队了。那我们这个地方呢,先去判断这个flag是不是,嗯,不等于空,并且呢,Flag。Flag要大于零,那说明呢,你有过锁,并且呢没有释放过。啊,没有释放没有释放完对不对啊,那我就行重入,那咱可以呢,给这个水local啊啊点型是set更新内容啊啊在这个flag的基础上啊,来进行加一啊进行加一操作。那么然后呢,那你可以直接成一个处啊,重入成功啊,获取锁成功,那就重复成功了啊啊可以了。那么然后呢,如果你之前没有获取过锁。那等于none。那或者你获取过锁,但是已经释放完了的啊,那我们都要去重新获取锁。那么一旦获取锁成功的情况下,我们返回之前,我们只要给local呢,哎,记录一下,记录一下,哎,我们已经获取锁了,此时呢,我只加了一次锁。它的初始化,嗯,获取所啊,那么来一个这是重复次数都是一啊,直接点上S什么一就可以了。
07:05
那我解锁的时候呢,哎,我们比较去判断一下了。我们先去,呃,给这个水local每解一次锁呀,我对水里面的。啊这个词呀,进行简易操作,点上get进行简易操作。那么减完一之后的话呢,我们来去判断是不是减为零了,那么three点上get,如果减为零了。好,那我咱就可以把这个锁呢给它释放掉了,那如果没有减为零的,那我减一就减一就可以了呀,就啥都不用干了,对吧,只有减为零的时候,我才需要把这个所能给它彻底释放掉。啊,它应该是这样子的啊,啊,那么咱们这个程序改造吧,啊,就算是已经改造好了,那么改造好之后呀,我们来去重新启动这两台服务器。好来看一下,呃,首先在高并发情况下啊,它有没有线程安全问题。
08:00
那么然后呢,我们再来去演示一下,它可不可以进行重入。好,我们现在启动应该是没啥问题的啊,咱先把这个库存数量呢,有零啊,重新改成5000件库存啊。那么改好之后呀,我们再去看浏览器里面,我们去访问刷机一下。啊,先预热一下,相当于啊,套餐已经预热好了,预热好之后呢,再重新把这个库存啊改成5000吧,改一下啊改成5000,那么改好之后呀,我们再回到这个解密工具里面去,我们来压测一下。好,我们来去压力测试。那我这5000个请求,你这个吞吐量啊,应该是几乎没有受什么影响啊,应该也是五百五左右吧,来看一下啊。诶好像有一点点影响,那不要紧,咱这一次的话呢,啊,不一定标准啊,咱可以呢,再测一次试试啊,我们来我们再把这个库存数量呢,重新改成,那实验室已经变成零了。啊,所以呢,线程安全呢,是没啥问题的啊,那么可以保证原子性好,那我们来去保存一下,我重新的把它改成5000,改成5000之后呀,我再来去压力测试一下。
09:10
啊,来去压测。而此时那些性能啊,提升了不少。哎,那狂飙啊,将近600的这样的一个性能了啊。打破我们之前的极限了,现在已经突破600了。表现非常不错啊。那么最终库存数量有没有更新为零呢?也更新为零了,所以呢,咱们这个水勒库啊。实现可重用之后呢,对性能呢,其实没啥影响的。那么能不能实现可重录呢?好,我们来测试一下可重录,咱们呢,可以把之前这个太子方法呀,再COPY1份给它copy到啊咱们这个里面去啊,然后把之前这个T的话呢,改成嗯,二。啊,这应该是三对吧?啊,改成三,那这个地应该也是三啊,那我们回到这里来啊,咱们这个地方呢,给它改成,这个地方给它改成啊,这就test对吧,我来调一下就可以了啊来一个雷4D啊然test方法。
10:07
在太子方法里面啊,我们之前呢是获取red锁,现在我们要获取咱们这个key pop里面这个锁啊,Get lock2个锁的名称呢,还叫LOCK2个锁的名称比较一样啊,如果你锁名称都不一样,不一样的话,那咱也没有必要去重录了。因为咱这货的是或去是两个锁了。不是同一把锁对吧?啊,那么大家同一名称是同一把锁啊,那么然后是lock点上,嗯,Lock影加锁。那么下面的话呢,来通过这个unlock来解锁,把这个this点呢给它去掉。好,那咱这个方法呢,也改造好了。啊,能不能重入呢。好,我们来去试一下啊,我们来去重新启动啊,咱们这两个服务。那看看能不能实现可重入。
11:07
啊,首先呢,我这两个服务呀,都已经启动成功啊,在启动成功的情况下,我们来去刷新浏览器,你还是可以刷成功的,那说明咱这锁啊确实是可重入的啊。啊,如果咱没有去加这个的情况下,那你再去这样去访问它肯定是会失败的啊,肯定会阻塞着。啊,那我们呢,呃,怎么证明呢,咱可以打断点去看一看啊,看它是不是真的重雾了,比如我在加锁的时候呢,打个断点,然后在解锁的时候呢,我们也可以打一个断点。然后呢,我们再来去,呃,重新刷新。哦,当然我们有debug启动对吧,咱们再以debug启动一下。
12:03
啊,启动呢,我已经启动成功了啊,那我们来去再刷新一下,应该进入断点了。导致加锁的,那么此时呢,我这个所谓local啊,它已经获取这个flag了,跟着flag值多少呢?啊,是为nu。那为难的情况下,咱要去创建节点,然后呢,看看自己是不是第一个节点啊,如果是第一个节点的话,它开始获取锁。在获得锁的同时,给我们这个log里面设置一个初始值是一。差距设定好了。那么生成好的情况下呢,我们再去走放行啊,再去走放行,然后又去获取了一次锁。那么此时获取到所的时候呀,咱们这个拉的值还是零吗?还是那么不是none么,它已经变成一了啊。那变成一之后呢,我只需要在这个原来基础上再加一就可以了,那直接就返回获取所成功了啊,那么咱就直接嗯,获取所成功了,获取到成功之后呢,执行完业务逻辑开始释放锁。
13:03
那么此时呢?我们二话不说就对水里面的这个质压进行减一。那么减完一之后呢,有没有减为零呢?啊来看啊,如果减为零的话,就走到这里面去,如果没有减为零的话啊,应该就走到这个下面去了啊。咱现在有没有减为零的,肯定没有减为零,因为40里面这个值呀,现在它已经是是大家这里看不到啊,已经是是二对吧,是二减完一之后呢,应该减为一了啊,没有减为零。那没有减为零的情况下来,走也走到下面去了。好的,再直接F9,然后又解锁了一次。那么此时它解锁的时候呀,啊,有有没有为零的,肯定减为零了,那么减为零的情况下,我们再去走,那么此时他开始去删除我们这个节点。三成这个节点,那么节点三成之后呢,哎,我们整个锁呀,就都释放掉了。啊,那么咱可重入锁。啊,也已经实现了啊,OK。
我来说两句