00:00
好,同学们大家好,我们继续,接下来我们需要将上述录脚本整合进我们的微服务Java程序,彻彻底底实现我们用h set哈希类型加带上了可重入性的新意版本的自我实现的red分布式锁。那么来回到我们这个。加锁的R脚本有了,安洛克解锁R脚本有了,那么接下来我们来看怎么将它整合进我们的微服务Java程序里面呢?首先我们的想法是这样的,复原程序为初始的无锁板。好,那么同学们啊,我们搁到这。6.0版我们呢也完完整整的完成了,它的改进点是不满足可重入性需要重新修改为为7.0 OK好了,那么同学们在这一大段啊,我们呢,直接呢将其呢注释掉。
01:11
好了,6.0版也已经没有了,恢复到我们之前的程序,那我们最最最最最最新的这个版本是不是二啊。来。这是我们当年2.0版所编写的程序,请大家看,我相信这个大家是不陌生的,只不过这个我用的是一个什么单机版的。洛克安洛克,那么现在意思就是说我们自己要做一套我们的red分布式锁,同理也要符合goc的look,那假设啊,我这就叫my red look,随便写的啊,那么这儿也就叫my register look,好,那这就要变成look,这儿就要变成UN lock,只不过这个lock它底层的功能已经被我们的lur脚本刚才的h set加可重录性满足,它的安lo克底子也是掉这么一套lur脚本,那么100%不会被中断,OK,所以我们现在的问题就转化为我们的7.0版本。
02:42
如何将我们的lock unlo将lor脚本自研版的red分布式锁搞定?OK,这就是我们第七版的任务,那么接下来同学们,这个就要牵扯到我们的设计模式,一句话,我们现在就要自己制定一个我们register分布式所,如果是锁,最好就要满足我们guc里面lock接口的全部规范,那么这样写出来的是不是才像模像样啊?哎,所以呢,各位同学,我们程序呢,已经复原为以前的无锁板了,听懂了吧?那么在这儿就是我们的洛克,在这儿就是我们的安洛克,其他照旧中间这个串。
03:42
哎,这块那是不是就是我们肚子这块扣减库存,主要业务逻辑没什么变化过,下面的问题就要写这么一个,并用lock按lock封装以后对外暴露供用户使用,那么接下来来吧,我们呢,首先新建这么一个类名叫red distributed lock red分布式所实现goc里面的lock接口,那么直白的说一句,在这块我们呢叫my lock,好,在这个下面我们新建这么一个类,这个就是我们自研的register分布式锁啊解释一下我们自研的分布式锁,然后实现了lock接口,好了,凡是锁是一个类类必然要符合实现某种规范,而这个规范在我们这就叫接口同。
04:42
同学们,Implement lock,大家请看这个是是,就把我们的规范来将它全部实现,那123456妥了,那么就明白哦,那杨哥晓得了,那后续我们这儿所写的是不是就叫你有一个类似于register distributed lock,我们自言的这个register分布式所,然后带上去以后大家请看它是不是带着洛。
05:15
按look这样的两个功能,好,那么接下来我们呢,就要对它来进行做文章来吧,通过刚才的讲解和说明,我们大家都清楚,在对应的我们的lock接口里面,123456主要有六个方法,那么我根据我们的业务实现对应的接口里面规定的方法,是不是就实现了我们自研的ready分布式所,那么在这听好下面两个暂时用不到,不再重写,OK,那这个是什么意思呢?是要你考虑啊,这个所的interrupt中断和这个锁的condition,由于在自己自研这把red分布式锁的时候,不需要考虑中断和condition这种情况,对吧,我。
06:15
就不用这个锁来配把钥匙类似的,所以这两个方法不用override,就是给它空着就行了,因为我们是属于什么呢?用完以后是不是要de delete,他把杨哥的red分布式锁直接就删掉,用完就删,用完就删,所以不牵扯这两个动作,碰到的概率不大。好那接下来我们就会明白,我们要实现一把分布式锁,最终就是要满足勾优四里面洛克的所有规范,那么来吧弟兄们,我们对外暴露的是不是就是洛克安洛克,哎,这个就是我们所要编写的内容和实际情况,那接下来我们满足guc里面对a QS lock接口的规范来实行落地,OK,好,那么结合设计模式,就要开发属于自己的red分布式锁的工具类,那么接下来同学们,我们这个落方法呢,全盘叫通用的。来讲解一下第。
07:15
一道你说啊,杨哥这个。这个是洛克,这个是安洛克,是不是就把你刚才这两段脚本一粘不就完了吗?这就是其中知识件,关键是,那么你准备这两个,你准备怎么改写呢?所以挺好,安洛克好说有且仅有一个,但是揣洛克,揣洛克之时叫禅是加锁,那么这个洛,所以呢,我们呢,要是不是要重写这个,这两个共计三个方法,这样麻不麻烦,这样的话是相当麻烦的,所以我们准备这么干,我们对外暴露的有这么一个落方法,只要你一调用,实际而言这货调用的是TRY,哎,Lock这么一个方法,OK,那杨哥这个串,也就是我明白了,洛克实际而言是掉的是这个,那么这样是不是可以少写一个方法?
08:16
听懂,那么第二种情况,那这个trywork我又怎么办呢?怎么又跟这个出lo带参数啊这个联系起来呢?所以我们在这儿就会得到我们对应的编写代码的一种技巧,不用把所有方法都实现一遍,只需要各种重载,你调我,我调它OK,所以搁到这儿,那么呢,调用这个方法,假设我这故意写个负1L,那么大家呢,先不要管啊,Time unit second,那么在这由于它会抛个一常,我们呢就将它框起来OK好了,所以说我们对外暴露是洛,实质上而言底层掉的是揣洛克,实质上而言底层又调的是出落带时间和time unit单位的这么一个OK好,那么这个由于呢,不是。
09:16
是重点,我为了好看一点啊,我们会明白,原来说到底我们对外暴露的洛克和安洛克,实质而言,对外暴露的真真正正的是这两个方法串和安洛克好。那么同学们,我们呢?先讲到这儿,接下来就要考虑我们设计模式的引入。通过前面的分析我们就明白了,对外暴露的是洛克,按洛克,那么底层源码我们把三个方法都重写的话,实质而言干活的就是它lock,调它,它又掉,它故意传了个负一,OK,那好,接下来我们该怎么办呢?如果time等等负1L,那弟兄们大家都清楚,在这块的话,咱写的这个代码是不是要满足这个条件才进来,那么满足这个条件他进来了以后。
10:14
我们干一些什么事呢?意思就是说你传负一,说到这负一等不等于负一当然等于了,那么在这是不是才进来杠啊,否则的话。不对,Return first啊,实质而言就说下面几乎是走不到,关键就是这个上面,相当于说这个,这叫什么lock,好了,我们呢,回到这讲解完我们洛方法的Java程序,接下来是不是把我们的lur脚本弄进来了,来,这是我们通过前面验证和测试过的枷锁的lock脚本,粘贴到这儿来,同学们老规矩甩成一行直接拿过来,来,同学们如果进来了以后,这是不是我们的脚本,同学们能听懂吧,这个就不解释了,相当于这块就是我们的加锁的洛克的洛R脚本,大家好看,调整一下,如果是已经有不有没有,或者是这个的话,那么。
11:24
来,同学们,我们干什么?这是我们的第二行,这是我们的RETURN1L。哎,好,同学们一。瑞RETURN0,这是我们的end,弟兄们,没问题吧,这个肯定没有,呃,不会错,这个呢,是我们曾经执行过的,对吧?那么大家都晓得,只要是有这个如尔脚本,那它下面掉的是不是就是我们的一些什么right templ,就是之前我们讲解过的这些东西,相当于说这大堆,那么自然而然是不是上面就要有这些什么red template,他们把它引入啊,好,那么脚本没问题,粘贴好了,那接下来该怎么调用呢?所以呢,回到上面,弟兄们,我们呢就要完成private string template template OK,好,这是我们的第一个,第二个private,那么string。
12:41
那么就是look name锁的名字private string,就是我们的UU ID value就是相当于这个就是key,这个就是value,那么这个UID呢,是不是ID加那个现场ID都好说,那接下来private这个long型写个什么东东,那么是不是?
13:05
Time time,那么弟兄们,这个是不是就是我们的过期时间,那折合成我们这些你就会清楚,这个相当于K1,这个相当于参数一,这个是不是相当于我们的参数二?弟兄们,我认为在这块通过前面的脚本讲解,大家应该没有任何疑问了吧,所以我们继续啊,完了以后呢,直接搞定我们的构造方法,那么这个构造方法就需要两个,一个是red complete,一个就是我们的什么red的这个所对应的名字好,那么首先这货就等于注射进来,这个呢,所的名字就等于它好了,那接下来this.u ID value等于什么呢?那么是不是等于我们的ID us.simple I。
14:05
D,好了,那么跟刚才一样,加上了以后,是不是我们的点current.get的ID,得到这个线程ID弟兄们没问题吧,然后呢,Exp time,那么这个时候假设我们写一个50或者30随便你,那么这是不就有一个天生的构造方法,通过构造注入能够完成我们对应的string ready temp和锁的ready分布式所,也就是杨哥这的什么写的z z YY ready洛杨哥所创建的这把ready布式锁搞定,这块就是一个变量的定义,加一个构造方法的著作。好了,有了它以后我们就来写我们的look,好,负一传过来,Time负一等不等于负一,当然等于了,所以说走进来,那么走进来我们要干什么呢?来,那是不是我们的string rest.ops啊,就跟以前的一。
15:06
大好,但是这呢,不是简单的OS set或者是get这块是不是调我们的rur脚本,OK,所以弟兄们点EXE,然后呢,干什么呢?你要还有印象吗?Devot这些都是在前面讲过的啊,不再多废话,那么在这呢,把我们的脚本丢进去script,然后呢,如果成功了返回一,失败了返回零,所以我们这儿这这个不尔这个类型,OK,这是我们的第一个参数啊,那么第二个参数以后说过了,它是不是要丢进去我们的这个K,还有这个二个一,二个二,那么一一匹配和之前我们讲过的这些内容几乎是一样一样的,那么这两个弟兄们我相信应该不陌生吧。OK,所以拿。
16:06
来一粘,那么这个K对应着而言,是不是就是我们现在所说的这个。罗克内,那么这个UUID啊言是就现在我们的u u ID value,但是对不起,它还有一个参数,那么这个参数是不是叫过期时间就是我们的二二,所以在这由于是string类型的stranger value off,那么呢,我们呢就要把它选择一个PI过齐时间time,好,弟兄们,这波没问题吧,相当于说啊,我们呢过来看一眼啊,第一个参数就指定了路R脚本,第二个参数那么就是我们的K1,第三个参数就是我们这儿的这个。UUID加我们的线程ID,第四个参数,Java程序里面这货就是我们这对标这个参数二过期时间,OK,好,这个完成好说,可问题是参考一下我们之前所讲解的啊同学们,我们加锁的时候要干嘛干嘛干嘛。
17:13
弟兄们,我们在干嘛?是不是这儿需要有一种东西叫自询呢,一样的思路和套路啊,那么回到我们这弟兄们,我们呢,开始呢,编写我们这块,如果你这些通道兄弟都已经成功了,好说那不成功呢,我们是不是要在这儿持续的来进行加锁对应的操作来,如果他已经乘高听懂了吧,那么假设这一小段是错处,就代表加锁成高处的话,我就取反听懂处前面加个取反是不是false false就说明什么,这一段执行完成了,你给我跳出来,你跳出来干什么?瑞return错王活那杨哥,否则呢,对不起。
18:14
如果你在脚本这段啊,这段是个false false说明这个线程它加锁失败,加锁false取法在前面加个取法,那是不是就是处处的话,是不是代表你隔一段时间以后咱们呢,再来重设,直到你成功为止跳出,所以这儿多少毫秒呢?比如说我们就60毫秒暂停啊,60毫秒以后你呢,再过来进行一下重试,这个就是我们的加锁程序,好,那么同学们搁到这儿,请看一下能不能理解并跟上,OK,到这我们的加锁脚本编写完成,接下来实现我们的lo克解锁脚本,用微服务跟我们的lur脚本进行程序的嵌套和组合加强,来老规矩,前面验证通过的解锁安洛克,那么来同学们是不是也就是。
19:14
是这一段直接呢拿过来,然后粘贴,直接呢给它改为一行来吧,和之前一样,同学们,那么这个呢,就是我们的unlo克string脚本粘贴过了。好了,为了帮助同学们更好看,那么隔到这,我们调整一下我们对应的程序,Then return这么一个好,否则l if得到得到得到这么一个多then then隔到这,Delete,然后L将其拿下,我们呢,Return,零,最终end,好,这个呢,我们的script脚本编写完成啊,这个肯定不会错,这是前面拿过来的,好,那么这个时候请大家注意一个细节,在这段脚本当中。
20:23
Return call,这个如果delete塔执行成功了,返回一个一,否则的话返回零,那么由于lur脚本它是C语言编写的,所以在这我们把话提前说好,这个空等价于我们的false OK,然后呢,这个一等价于我们的错,OK,这个零呢,等价于我们的负,所以听好它是有三套值,所以在这块。
21:00
它不方便用布尔形,因为布尔形没有这么一个烂的,虽然说它意思上是代表force啊,所以在这我们要做一下我们对应脚本的改写,那么还是悉的配方,还是熟悉的味道,偷个懒啊,直接。粘过来,那么还是一样的,在这块呢,执行我们的解锁脚本,OK,这块就不再是布尔布尔行,一个值,两个值三个值,最通用的那么乱行按数字表示,这货是force,也相当于我们的零,好,这是一个小细节,那么这块完了以后,其他的无非也就是look name呀,Key和我们的UUIDOK,当然在这块它用不到这个,你留着也无所谓,好那么搁到这,弟兄们,我们呢,直接呢,Flag出现一个标志位,兄弟解锁有没有成功啊,按照你上面的这个反馈,对吧,如果说现在。
22:14
零和一都好说,最怕你就是等于这个,那所以如果说那等等,我们上面这个flag说明解锁是不对的,那么此时我们呢,可以抛出个异常new runtime exception,比如说this。Lock lock不存在,OK,行。这么说同学们能跟上,那么搁到这,我们的枷锁和解锁的脚本彻底完成来,回到这儿,我们呢,就来看一下我们通过guc里面的lock接口,这是按照规范对吧?我们要写锁,你只要写锁实现guc里面的lock接口,人家绝对挑不出你毛病,你不可能比道格利这个大神还牛,那么我们现在实现了这么一个东东全部写完,那么接下来我们是不是就可以尝试着调用一下我们对应的。
23:26
Ready分布式锁啊好,那么接下来弟兄们回到我们的第七版这个程序,我们要一调用这个线程一进来了,咱是不是非常和谐美美的啊,比如说我们在这我们就lock lock等于尿。放跑到这了,以后弟兄们大家请看我们这出现的是不是在这块要把我们的这个传进去对吧?那么look严格的锁这一波没什么问题吧?好了,下面相当于说就跟我们以前的一样,New了一个re look一样,我们这儿new了这么一个look对吧?然后在这儿是不是就是我们的lock lock对吧?那么假设这个叫我们的register分布式所的这么一个洛克,好,第二个我们搁到这是不是叫我们的安洛克同学们没问题吧?那么基于此,弟兄们思考一下,答是不就完成了我们一直欣欣向往的设计中间业务逻辑这一坨不变,Lock啊,Lock,我们自己实现了lock。
24:48
接口的规范对外暴露了lock and lock接口,而且测试成功通过的高频发下面都能用,也有满足了可重入性,那么这样谁进来谁加把锁,然后去干活,干完了以后按洛克打完收工。我们大致的意思啊,就是想自研一个我们自己手写的ready分布式组,通过它来调用下面这些动作。好,那么同学们思考一下,现在我们所写直接使用上面的代码设计会有什么问题吗?来,弟兄们搁到这,我们这个是叫register分布式所,那么可是我们在实现分布式所的时候。
25:33
要听好,有可能我们在整个组员和框架当中写一套自研的框架,它是要考虑产品的跨域和通用性,一句话我们现在是不是就是look有这个有这个,这样的red获得锁就被写死了,假如以后我们是需要有如keepper my s来做这个分布式锁,那么这个时候请问你这是已经写死了,就是叫red,可是我希望我们传一个锁的名字进去以后,传一个type进去以后,我需要哪一种来实现,你传red就是red布锁,你传keepper就是keepper分布式锁,那么这样是不是要我们叫参考类似我们spring一样的设置注入,是不是引入我们的工厂设计模式啊,OK,好,那么同学们加减锁到这。
26:31
到此结束,告一段落,接下来是不是就设计模式来进一步的加深,加强我们的自研分布式所?
我来说两句