00:00
好,那么同学们通过前面我们已经清楚了。两套这个库存一定是会出现超慢现象,所以从第三次开始,我们上我们的register分布式所,那接下来回到程序,我们这儿呢,一点点给同学们整理注掉,重新写。这个呢是V2.0版单机版加锁,配合N和吉米塔压测号,不满足高并发分布式所的。性能要求出现。超慢OK来了,那么所以说这版程序,那么也就是engines解密压测以后是不OK的来吧,那么同学们请给我写一版来。
01:13
这些代码直接复用。和之前一样,通过前面的讲解和演示,我们清楚了。我们是不是要是按分布式所用set NX命令?我们在这A和B,也就是我们77778888去这建一个T,谁先建成功说明谁强到所好话好说,这个代码可不好写,来,同学们第一步。子俊,我们的key,假设我们现在这个key就是杨哥的RA分布式所,OK吗?那么我们这个value呢?那保证不重复UU ID value,那么ID put图工具包点simpleu ID,那么再加上我们的一个。
02:16
二的对应的当前线程的ID,那么弟兄们。这个改分之百不会重复吧,拥有ID不会重复,再加上一个请求线程不会重复,那么在这相当于改吧改吧。我们的分布式锁这台机器,那这就是set NX,这个就命令写差了,这呢就是set NX,这个是我们的key,那我们的value呢,就是我们这个u u ID value就等于我们的UUID配合上我们的线程ID。
03:00
对吧,这样呢不容易重复,我们也可以区分当前这个K这个分布式所是被哪一个线程所持有,所占有,那么当然到最后如果它用完了,咱们呢,再进行对应的什么。丽塔释放这个资源对吧,好行。命令好说,那接下来同学们,子君,Red temperature.ops for value点怎么着呢?Set if absent来,各位同学,我们呢,一步步演示,先选它,这个是不是就是我们的key加上我们用ID value,人家呢,出现的是返回的是一个不尔值,OK,如果这个加成功了。那么代表往下走。好,这个话好说,如果你加锁成功,谁抢到这把锁,谁去干活?我的问题是假设抢不到呢?因为AB2个不是七就是八,假设现在七顺利的抢到在这儿。
04:15
写成功了,写的又有ID冒号线程ID是七号。那这个B应该怎么办呢?那么同学们不要忘了,想不到的线程要继续重设。我现在点一下,我要去扣减这个库存,我要买东西吧,你不能说对不起,我抢不到,这次购买失败了,我靠,你返回给前台,谁还来逛你的电商网站,那基本上老板肯定会砍死你。我卖不出货,大家等着观战,所以在这我们要进行一个重试。就说抢得到的去干活。抢不到的,请同事同学们我暂停一下,请大家动动脑子思考一下,这个同哦,你这会怎么写?同学们有些呢回答正确,有一些,那么还是跟着杨哥咱们呢,一点点思考。
05:13
第一个如果我们这个flag。它是force什么意思啊?就是flag等于force。代表什么?是不是抢所失败,抢不到的线程要重设,所以如果这是负四,干嘛将其取法?你要咋整?是不是要再来一次啊?什么叫再来一次啊?是不是这段程序要重新来强锁加锁,那么这个叫什么现象?是不是我们的递归重式啊?同学们能理解,当然你不能说一抢不到马上去从事哦,服务器也受不了,那我们呢,一般在工作当中暂停20或者十毫秒。
06:11
进行递归重设。来,同学们。搁到这儿,我们呢,直接呢是暂停20毫秒进行递归重试啊,那杨哥怎么递归高并发下面抢得到的下去干活,抢不到的在这儿隔了20秒毫秒以后再来一次,是不是进行,我们重新来看看这能不能建锁。OK,好了,这是一,那么else就说明是什么。如果这是处处取反,是不是false不进来,所以这个下面才是真真正正干活的,那么干活的代码咱们呢,也就不废话了。
07:01
是不是也就是我们这大段代码所要编写和处理的内容?来。当然,这已经没有我们的。Look unlo什么事了,好,这个else,那么就是真真正正干活的,那么来TRY这些东西一律不动,但是这个finally这块发生一点点的改变,好,那么同学们这块别忘了看我们的设计大纲,这个杨哥的分布式锁,反正这个key你叫什么都可以啊,这个有了,这是用完了你得删啊,对吧,所以呢。如果说抢不到的,请你等个20毫秒去重设,抢得到的呢?这个就是接下来这个是不是就是强锁成功的请求线程,进行正常的业务逻辑操作,扣减库存对吧?扣减库存这个不用说了,这些都是写的正确的代码,那么这个final里这别忘了我们是不是要temperature o for value点什么鬼,是不是delete,诶,怎么这个变成出来了。
08:27
点O不是去,那么这个就是点delete我们的这个TOK,好,那么同学们这个是不是就是。抢得到的正常执行业务逻辑,扣减一个商品,干完以后给我删掉,抢不到的,对不起,请在这儿继续重设,OK,好,各位同学,那么接下来业务逻辑编码完成,我们呢?来尝试一下我们对应的测试好。
09:00
启动我们的7777微服务,回到我们的也设置了100个100个,那么来看一下我们这能不能成功,那么等它启动完成。接下来我们开测。那么稍微修改了我们的代码以后,干脆这次我们直接呢在高并发下面测试啊,就不再测单机了,我们把它的值改成三,改成5000。好,现在呢,商品库存呢,有5000个随便啊,你这两千三千四千五千五万随便你我这就随便乱写一个,写个5000,这是第一步,所以呢。然后。第二步,我们回到我们的高频发解密在这块啊。5000,由于啊,我们这儿呢,已经不再用这个单基锁了,所以我这呢暂时不通过N进去访问,我们在这呢,就是要不然我每次要启动两个浪费时间,那么这个A启动了,我现在呢,没有GVM什么事了,没有什么snch look look,我就在这跟red谁来都是带这套代码,所以搁到这儿我们只启动一个节约时间7777,所以解密这我们的IP就换成我们的Windows的主机IP,端口号就不再是NS的八零,而换成我们自己的7777 OK,好,那么同学们接下来呢,后台清干净。
10:31
数据是5000个,我们直接再走一遍,高频发的测高并发的通过了单机版的这个点一下点一下人工版的是不是肯定是能够通过好了,那么各位同学我们呢,跑一下我们的代码来看看,直接语发送,好我们请看。后台正常而言是不是开始不停的在扣减了那么100个请求线程啊,因为这个哦,不是100,抱歉口误,一秒钟是不是5000次请求就打过来了,哎,反正我一秒钟发射给你了,你爱怎么处理你们去抢你们的接口,就看你的IO和流量带宽好那么同学们在这我们get怎么样?还没完的吧,那么来这儿试试看我们的。
11:14
好,可能已经结束了啊,那么来get inventory同学们请看是不是等于零,等于零说明什么,是不是成功的卖出去了,这么说能跟上好,那么假设这个锁这块啊,刚才没演示成功,那么不妨呢,同学们,我们来再来一次啊。好,现在是不是又重新有5000个了,那么我们再跑一次好吧,只要他最后能打出零,那么正常而言应该是没什么太大问题,好,那么同学们请看,错误率是零,吞吐量这么一点好吧,那么来全部删干净,我呢,再请求一次,再打过来,那么同学们。怎么样,现在有了吧,是不是UUID和187,这个就是187号线程自自带的一个流水号来进行。
12:08
扣减库存分布式锁建立成功,好,那么同学们现在干到2000多对吧?那么这顺便说一下,这个UUID啊,我们这儿呢,用的是糊图工具包里面的这么一个动作,它请大家看啊,底子就是我们这个UUID这么一动作,只是去掉了这个中间的这个短横线啊,底子还是这个,所以呢,这个呢是一个小小的工具类,我们在这呢,看数字的时候呢,也就看着清爽一些,对吧,中间没有那些减号,那么同学们再来一次,还有没有呢?没了,因为谁用谁建立我们的red的这个锁,用完的必须删除,最终程序停下来为止,这块必须得是呢,OK,好,那么同学们这个就是我们对递归。3.1这个版本相关的测试好,那么请同学们判定这个代码块,大家再想一下有没有什么问题呢?
13:03
OK,好,那么请同学们。集思广益,畅所欲言,我现在写的代码测试通过了,它对了,它功能完成了,但是同学们思考一下性能相关的问题,好,那么对于3.1版的这个程序,同学们我们呢,就先讲解到这儿。通过3.1版程序的编写,我们成功实现了5000个商品。用吉米塔压测通过程序A是零,没问题,貌似看我们的程序挺和谐,但是这儿还是那句话,先完成后完美,先功能后性能,我们这大家思考一下有哪些潜在隐含的bug?那么呢,有如下几个,第一个。
14:00
递归重设没错,但是在高并发下面严禁用递归重设方法,调用方法,这个就是递归没问题,但是弟兄们大家都清楚啊,杨哥在给大家讲GPM的时候是不是说过对和账特别容易溢出,尤其我们的账方法调用,如果现在的库存不是5000,是5万,5万次打过来并发数又高了,我们这儿是教学DEMO,这个停顿时间我随便写了个20毫秒,可能时间间隔上有些问题,真实上生产了是不是容易爆SAR这错,所以测试手工是OK的,吉米塔5000没问题,但是递归这种思想没有错,但是容易导致c overflow AR不太推荐,所以我们需要进一步完善,把它从递归取消。那么同学们想一下,我们用什么来替换递归,这是第一个问题。第二个问题,弟兄们,杨哥在讲GOUC的时候啊,如果有兴趣的同学B站上看一下我的GOUC2022篇高级篇对吧?你要是能坚持从头看到尾,100%,对你的高并发多线程的程序的内功心法是会增加的,但是在这儿没办法哈。
15:16
大多数人40级都坚持不到,所以呢,有些时候辛辛苦苦录了,不会有多少学生看这个也是很无奈的事。但是呢,我们依旧啊,凭良心做事,杨哥依旧要做到位。好扯到这,我们强调过,勾C里面说过,要防止多线程的虚假唤醒,一般不要用if判断,咱们是不是应该用Y要判断。OK,所以我们要改为3.2版的程序,多线程的判断。虚假唤醒要防止和避免用WHY要替代if,既然说用外要替到if if,我们自然而然就会明白,在这儿不能这么写,我们是不是尽量的用我们的自学替代我们的递归呀?哎,所以说同学们,在这儿请同学们跟着我继续修改程序。
16:09
来这个呢,对照我们的脑图啊,这个呢是我们的V3.1版本,它能完成的功能呢,是什么呢?递归重试OK。啊。这个时候容易导致lo。所以不太推荐这是第一个,那么另外高并发唤醒后推荐用while判断,而不是if,那么所以说弟兄们3.1版本的程序过,那么。回到这,弟兄们,咱们呢,3.2。
17:05
好,那么老规矩。还是这些对吧,那么这些呢,我就是神写好,接下来这些不变,那么注意不用递归了,高变化下容易出错,我们用自旋替代递归方法重试调用。所以。这是第一个,第二个呢,也不用if了,用外氧来替代两步,所以在这儿,弟兄们喂,我们干什么呢?有点类似于我们的。讲过的勾UC那个CS那一章,我们是不是说过一种东西叫自旋的思想啊,哎,所以说呢,不要方法调方法,而是执行多次命令去占用。
18:11
那么搁到这儿,同学们,我们呢,拿过来。来这块是不是直接天生就返回一个。不尔行,所以我们在这儿取法,那杨哥,你准备怎么干呢?和之前一样。懒得写了啊,这稍微做一下变更。那么来弟兄们没有这句话了,这块。返回值K和value我就在这执行,如果是错,说明我强所成功建立了这个red分布式锁,往下走干活,如果是这一小段是force,说明对不起,已经有人在我之前建成功了,还没有示范,所以如果我这小段程序是false false取反,是不是错处完了以后是不是再进来这个Y啊?
19:15
听懂了吗?所以说在这块没有进行方法调方法,而直接是用我们的自旋,类似于这样的思想代替了我们的递归,此外输进去以后,苏醒以后用Y啊来进行判断,那这个是不会拉回来重新。判断一次OK,所以说呢,在这块性能和效果上就会比我们递归更加安全一些,好,那接下来呢,如果说通过了,那么。这大堆是不是就是我们的try catch finally,那么在这块拿下回到这了以后,那么就是后面的这个else这道的东西啊,同学们都晓得是什么意思,我也就不写了,那么来给我签。
20:03
搁到这儿,大家看一下。KV建分布式锁,用Y啊来判断建没建成功,建成功的说明强锁成功的,请求线程进行正常的业务逻辑操作,扣减库存往下走,那每一件成功的。同学呢,每一件成功呢,拉回去重新再建,直到建成功为止,OK,所以这个时候我们改为3.2版本,多线程思想来判断。用while替代if,用自学替代递归同式,OK,好,那么同学们老规矩,简单的来做个压测,启动我们的微服务,然后呢,搁到这,我们这个赛呢,我们这次就少点啊,就3000个。Invent。来3000搞定好,那么同学们微服成功启动,那搁到这清除,然后呢,小三千没问题吧,我们直接来进行一下我们对应的压测,来看一下套台程序,大家看我们也就不用玩什么单机版,反正你3000次的调用都成功了,那么单机版的手工人手去点击的也肯定会成功,对不对?那到最后,那么同学们来幺九零七十二三十搞定零成功通过,所以3.2版本这个程序就比我们之前那个递归又近了一步,深刻体会杨哥这句话。
21:42
先完成后完美,先功能再性能,真不是时写个增上改茶,然后呢,出去说所谓的混口饭吃啊,这种工作现在找不到了,2023年,所以希望各位同学这些内功务必掌握好,老规矩,各位亲,这个呢?
22:03
就是我们现在的V3.2版本,好了,比起3.1又近了一步,那么弟兄们请判断一下当前我这个ready分布式锁还有哪些潜在的bug和隐患,我们一点点抠,一点点完善,一点点带大家。增强内功,OK,好,同学们,请大家认真思考,我把代码发给大家。接下来我们继续,那目前呢,我们的程序呢,到了3.2这个版本,优化了两个,用自旋替代了递归,用while替代了if,那下面请同学们继续动脑筋想一下我3.2这个版本,那么说一下啊,当前这一版在3.2这个版本写到这儿了,高频发,下面我们也测试通过了,表面上看是没有问题的,万事无忧,那么请同学们分析还有哪些潜在的问题和隐含的bug,我先暂停一下录屏,请同学们把你的答案打到我们的对话框,感谢各位同学的回复。接下来我们来分析程序写到这儿了,以后我们这儿会有一个隐患,那就是right。
23:19
分布式锁的过期时间有这么样的一个约束,也就是这个T,分布式锁的这个关键T,它必须带着一个过期时间,理由如下,咱们先说正常业务逻辑假设啊AB2个微服务来调用red分布式锁,谁建成功了谁去。调用库存扣减模块,减一个没问题,这是一切顺利的前提下,但是程序里面十有八九是会有不顺利的情况,那么假如说这样。我A先进来,也确实成功,在red这儿新建了这把锁,比如说像这儿啊,我们就建了这么一个啊流水号就是四个键,一句话,反正现在这有这把锁了,没问题,换以前你顺着往下走,用完了delete完活,皆大欢喜。另外一个自学了以后强盗。
24:15
A用完了删掉,B新建用完了删掉,就这么依次轮替,良好续接,很和谐,怕就怕这样一种情况,这个A呢,通过这了,他也建成功了,也进到了出这个地方,假设到这49行或者随便一行的时候,也就是在final里之前,注意不是程序出了bug,是整个微服务。直接宕机了,没有这块了,那就麻烦了,由于我们这儿建的这把锁根本就没有加过期时间。所以这个时候就会导致A键成功,也进行对应的业务逻辑操作的时候,由于微服务服务器都宕机了,它根本没有机会走到final这块,就会导致A所见的这个分布的key并没有包含过期时间,一直存在。
25:18
那这个时候。A,你没有了BCDFG,其他的订单模块,人家可是继续在走着呢,那这个时候每一个程序都会去检查我在这儿这个K能不能抢夺成功,非常抱歉的通知你,A键的这个一直存在,但是A自己又死了,那么导致其他模块根本就建立不成功,所以调用会失败。OK,那么搁到这儿我们就会明白。导致我们的当前代码,我们这儿呢,就会有这么一个隐含的bug啊,这我就不再写了,好吧,那么同学们,我们在这儿呢,直接把这段注释粘过来,然后咱们呢,再进行对应的编码改写,这是3.2版本,它存在的问题,OK,改了是改了哪一些,但是存在的问题就这么个情况,好,那么各位同学老规矩,那接下来呢,我们呢,是不是也要把我们对应的3.2给它注掉。
26:28
然后改写为我们的4.0相关的版本,OK吗?好,那么同学们搞到这。来吧,那么当前这个版本啊,那么也就是我们的V4.0了,好吧,OK,那接下来我们可以看得出蛋鸡与过期和繁殖死索能理解了吗?这是我们4.0版本想要解决的问题,来杨哥秒懂,那么现在确实你所说的保不齐微服务他挂了,他走不到final这块,没有办法自己删除,那这个时候A。
27:12
你给这个锁加个过期时间,你不能一直占用对吧?哎,比如说像我们这TTL,如果说我们这个T大家漏眼A键的忘记删除了,负一什么鬼,是不是永不过期啊,弟兄们这个都清楚吧,所以我们这需要有一个删除的动作,OK好了,那么怎么加呢?所以说搞到这儿。弟兄们,我们呢,来。多少啊,那么下面是不是这个T建成功以后,立刻给它加一个过期时间,比如说30秒钟,我随便随便写的啊,这个时间你知道这个意思就行了,好,那么下面我们在4.1这个版本总体是4.0啊第四版,那么4.1第一步我想请各位同学看一眼我。
28:10
检锁成功,检索成功以后,立刻迅速马上给他加了过期时间,那么这个时候你想得的这个TOK 30秒钟或者十秒钟以后自动过期,那么就算你这个A死了,那么BCDEF其他模块。不停的在这咨询学了一段时间,哎,终于A自己建的,就算你没有de delete自己删,但是总体而言到期过期了,其他模块抢到检锁成功,你这边做不了,不要影响别的,对吧?你自己不吃这碗饭可以,但你不能砸这口锅,导致大家不通畅。好了,下面我的问题是请同学们思考,我这么写O不OK,好,请大家讨论,我先暂停一下录屏,感谢大家的回复。现在我们的关键问题4.1版这个程序,这是Y,这是我刚刚写的,那么要是请大家思考可不可以这么操作,答案是不可以,理由还是高并发多线程下面的一致性与原子性的考虑,说人话。
29:18
设置的K加这个过期时间是分开的,必须要合成一行,具备原子性,同学们请看啊,我这是个Y啊。设置set一个T,我这是一个过期时间,这两行两个红色框框之间是有代码缝隙的,有可能我A。将氨将搁到这儿的时候,别的线程也许在我前面已经有了,那么这个过期时间如果给它们两个分开的话,是不具备原子性的,所以最合适的方式是不是应该把它们两个合二为一啊?所以在这儿不要这么写,相反我们在这有set if absent的时候,来同学们set if absent。
30:11
大家看在这儿是不是有第三个?参数方法,Key value,过期时间,一句话必须要用这个命令,是不是把我们的过期时间写在同一行,那么这样是不是用的?单线程的原子命令,保证两行合二为一,这个才具备原子性,OK,好,那么同学们这个压测肯定没有任何问题啊,我们得节约一步,因为这个我之前都做过,程序是在3.2的基础上就加了个过期时间,建这么一个T,没有任何影响,所以我们这抛格拉省一步,放心肯定成,所以。4.2版本的这个结论,加锁和过去时间必须设置为同一行,保证原子性,那么这个就是我们4.0版本这个程序一句话改进点啥情况?加锁和过期时间必须是同一行,保证原子性,那么这个就是我们4.0版本对应程序相关做的改进和优化。那么下面各位同学请再看看我们4.0版本还会有哪些问题。
31:34
现在4.2版本,也就是我们的4.0版了啊。这是4.1,不OK,这个呢,是改成我们4.2啊,我就统称4.0版了,接下来请同学们继续评估我们还会有哪些隐含的问题,那么自然而然,同学们请看这样的一种情况。第一个。我这进来了,也加锁成功了啊,假设30秒钟,那比如说啊,我们一般的业务嗯,要干20秒钟结束,当然啊,真实业务不会这么长,我们随便随口这么一说,大家明白这个意思就行,我们再留一点富余,保证A线程你自己建锁,自己加了过期时间。
32:19
搞定,那么接下来然后呢,串A线程进来呢,干你的业务逻辑对吧,自己持有自己的锁,干完以后假设18秒钟就完成了,那么这个锁的过期时间是30秒钟,无所谓,你自己呢,删除完活好可是。不怕1万,就怕万一有这么一种特殊情况,那么就是要防止你误删除了别人的锁,这个怎么解释呢?A进来自己建锁,自己加了过期时间,很和谐。但是抱歉。
33:00
这一次呢,出了点问题,平时呢,你呢?30秒钟以内肯定可以办完你对应的业务了,但是现在呢。可能超过了30秒钟,你自己建了锁,建了这把锁。自带着过期时间。你A线程在这干,可能这次你用了32秒钟,然后呢才完活,那就麻烦了,A你这建了把锁,你自己是A30秒钟倒计时,B我可是在外面进行着自旋在等待呢,到第30秒钟的时候来了啥情况?哎,你还在这干着呢,同意吗?但是对不起,这个这个分布式锁,这个T到30秒钟时候。突然失效过期了,BCDEFG,其他外面的可是在这自选抢着呢,第30秒钟,既然讲好这个K没有了,B成功抢到,那么这个时候B是不是自己建了同样锁的名字啊,叫这个,只不过他现在的ID和流水号变了,是变成B它自己的了,也建了一个30秒的T,然后呢,B呢,也准备做对应的业务,两秒钟以后A这32秒,30秒加二三十秒过了以后,又过了两秒钟,第32秒的时候A。
34:33
完活了,二话不说,一删那坑爹了。这个时候迪丽塔你确实删除命令成功了,从命令操作上,程序上没有任何问题,但是业务上犯了一个最大的错误,此时A你自己建的这把锁,你自己的这把锁在30秒的时候已经过期了,现在你删除的这个K是B请求自己新建的,所以A1杀,自己倒是很开心的跑了。
35:04
那么这个时候等B完成了对应的业务逻辑,他准备删锁的时候,你看懵逼了,我的锁呢?所以我们现在第五个问题叫防止误伤K对应的问题。当前代码4.2啊,也是我们现在程序里面的4.0,接上一步这个问题是在这儿的。实际业务的处理时间如果超过了默认设置key的时间就很尴尬,我们刚才呢举了一个案例啊三,一般30秒足够了,但偏偏这次你干到了32秒。超时了两秒钟,B也就抢进来了,建了个锁,第二次见锁,这个是B的,但是A去删的时候,那把B建的给删了,所以说张冠李戴,A删除了B。建的锁,也就是你删除了别人的锁,那么同学们请看上面是时间点,这个是red服务器,这是AB2个微服务,A用这个命令是吧,30秒没问题。
36:07
如果这个T不存在,获取锁成功,见锁成功,一顿操作猛如虎,哒哒哒哒哒这么干,反正啊,假设是30秒钟OK,到这儿才结束,那么这个B过来了,一检查存不存在啊,现在还存在呢,这个B没办法,只能在外面自学,老老实实等着,随着时间的推移到达30秒钟看到没有,到这儿呢,然后呢,到这儿了以后,这把锁自动过期,时间时效,现在在red服务器上面,这段时间是空弦没有锁了,这个时候B在外面不停的自旋,OK,马上抢夺到这个关键点没有锁了,我这个B键锁我自己呢进来了,也就是第二次见锁成功好了,他见锁成功以后。B呢,就忙自己的一顿操作了,对吧,B呢很守规矩,见所成功,谁抢到谁干活,但是呢,超时了,这个A。
37:04
不好意思,被进程A误删除了,一删掉走人,结果B完成工作,自己跑出来看的时候,发现我的妈呀,我的锁呢,所以说没了,那么接下来,所以我们要修改我们的程序,把它变为5.0版,修正4.0版的潜在隐含问题和潜在bug,一句话,只允许自己删除自己的锁,不允许删别人的,所以呢,搁到这儿,那么弟兄们,我们呢?出现的问题。也就是。在这儿。出现了一个大麻烦,Delete塔,这好我们这啊,那么同学们这个呢,就是我们的V4.0版,那么存在问题这块只能自己删除自己的锁,不可以删除别人的,需要添加判断是否是自己的锁来进行操作,OK,所以说4.0版我们改进了什么,但是在4.0改进完的基础上,我们又存在了什么问题,那么弟兄们,我们一点一点的加好了,那么接下来呢,我们这个程序呢,将会慢慢的修改为5.0版,同学们没问题吧,OK,好。
38:45
那么这个呢,我们呢,就是一步一步的啊,怎么推演做出来的,给同学们说的清清楚楚好了,那么在这一波啊,干脆这个呢也就不要了,那么好弟兄们,这个呢,也就是我们的V5.0版,那它的改进点呢。
39:04
来这个呢,就是改进点,只能删除属于自己的key,不能删除别人的,所以在这块我们需要加一个if。re.to for value.get这个K,那么现在假设A键成功了,那么这个K叫这个,那它的值是不是一定是流水号加自己的线程ID,这个是不可能错的,对吧?所以隔到这儿你按照这个K都叫这个,但是你们得到的值u u ID value它是不一样的,那么干嘛?第二等于我们的u u ID value,好,那么此时我不管你是超时也罢,或者怎么样,那假设A。
40:00
过来这看我来删的时候必须要是我自己的我才能删,如果不是我自己的,那么弟兄们这个是不是不合适啊,OK,好了,那么同学们,这个就是对应的我们的一个改进点,只能删自己的,不许动别人的,OK,我们把这块5.0版对应的程序以及我们写的注释来说一下,那判断加锁以解解锁是不是同一个客户端啊,这点字我就不写了啊,同意同一个才能行,自己只能删除自己的,不要误删除他人的,不要出现A把B的给删掉了。好,那么同学们,这个就是我们5.0版对应的bug和改进点,那么同学们依旧请大家。思考一下,我们还存在什么问题?当前我们的代码已经改为了5.0版,从1.0版到5.0版,一次一次的优化迭代改进,那。
41:01
解决了很多潜在和隐含的bug。那么接下来。一惯例请同学们依旧请思考5.0版下面还有哪些bug我们没有解决,那么自然而然啊,这个串这块。永远是固定的业务逻辑关闭,那么上面答案KV不会错,自学finally那么大家想一下,这个程序还有哪些潜在隐含的问题啊。首先。各位同学。上课很辛苦,但是请一定坚持到底。另外,不要整天只会满足于什么,一键生成,做增删改查。杨哥带着大家写这些东西,我连数据库都没有,连故意的,你没有机会去操作增删改查了。但是呢,我就告诉大家,咱们就这样认认真真一步一步的。把我们的程序写建状,写圆满,甚至考虑一些极端情况下面对吧,我们会有哪些bug?哎,增加大家的内功和基本功,所以如果有一天你离开你们公司了啊,我希望你的技术不要说啊,我们公司的技术没什么,好像也就是写了一些增删改查啊,不能这样,正所谓万般带不走,唯有业随身,这些业就是你的功业,坦白讲,功夫的功啊。
42:27
一句话坦白讲就是你在考虑问题,设计代码的时候,你和其他的普通程序啊,有没有什么区别啊,永远不要去学习什么一键生成,毫无价值,毫无意义,哎,到最后请记着你在面试的过程当中,面试官可能会说这位同学首先客气一下啊,客套一番,感谢你到我们公司面试,我看你简历,你也有个三五年工作经验了啊,咱们呢,也就不要去聊那些哈希map底层是些什么叉叉叉的八股文呢,请说一下你过往的工作项目和经历当中,你觉得最亮眼的是什么,你觉得?
43:05
面对过的最大的技术挑战是什么?哎,所以说呢,各位同学,那么这个时候希望你呢,能够有一些准备的,甚至是有意识的在工作中。锻炼自己一些亮点技术,那么这样的话呢,面试的时候跟面试官呢,可以聊的有来有往,对吧,所以呢,这些东东呢,还是请同学们呢,耐下性子。耐得住重复,一步一步的把它写完整,写全面好。各位同学,那么接下来我们呢,来看看在这块目前出的问题,在这理由请看我们的数值是不是K。和过期时间,以前我们在4.0版的时候,同学们大家还看不看得出这。是这两个非原子操纵对不对,在我们的高并发下面,这个是不是带来一种隐患啊,重我们呢。
44:08
有一个命令让它合二为一,一定要保证在高并发下,面对red多个操作命令,重要的业务尽量缩编成一行。就像买CQ的事物一样,要么一起成功,要么一起失败,统一标准,那接下来出的问题是在这也记我这个衣服判断。和我的迪丽塔并不是原子操作,所以在这儿如果它判断了以后,突然进来卡在这了,没有删干净来别的业务又来影响了,这个是会有潜在的隐含风险的,所以我们需要有一种操作把我们的get。判断获得值和我们的迪丽塔合二为一,那么这个就是我们在项目当中给大家讲解并分享过的一个知识点,请问如何把多条red的命令捏成一行,揉成一块,大家请回忆一下,那么各位同学,请把你们的答案打在公屏上,在公屏上,在对话框上。
45:17
对应的答复,那么。回答正确,我们是不是强调过一种东西叫撸啊,脚本OK,好,那么同学们。老规矩5.0,代码直接拷贝,那么它这块存在问题就是最后的判断加吉塔不是一行原子命令操作,需要用lur脚本进行修改O了,那么来同学们。6.0版程序正式开始,那这个呢,也就是我们的改进点对吧?6.0我们来看看,搁到这我们需要用落R脚本保证原子性,来吧,5.0版见过源码了,问题final块的判断,Delete的删除操作不是原子性的,所以在这块需要启动录R脚本,编写RA分布式所的判断,并整合我们的删除代码。
46:32
好,各位同学,这个不是我们胡说八道,这个是官网red的要求,请看一眼。那么首先啊,我们大家呢,路也何为撸啊脚本,那么首先做个简单的介绍啊,它是一种轻量小巧的脚本语言,那么我靠一说脚本语言,那么同学们至少应该想到两个东西,第一个大家呢,一定在学Linux的时候听说过需要脚本语言吧,那说白了就是把一些命令用一些。
47:04
编程语言,比如说线编程,把X的命令、Linux命令整合进去,达到一种复杂功能的体现,OK,这种就是脚本语言,你说杨哥听不懂,说人话好。同学们,你们已经学过两个东西,HTML和Java,这两个语言学过吧?HTML是最简单的静态语言了,对吧?就是一个静态页面,那么同学们,你们一定听说过,比如说我在HTML里面干过这种动作,对吧?干嘛?我在干嘛,我是不是在H秒静态页面里面用这种括号拍启嵌进去了一些Java代码,那么弟兄们,这个技术也是一个非常成熟非常老的技术啊,当然他目前已经被VE所替代,这种情况下,看到这种图标,同学们是不是应该会想起种东西叫JSP啊,如果从宏观层面语言的理解,JSP你也可它当做一种是嵌入式的,哎,也就是他在HTML里面嵌了一些加法代码。
48:09
OK,好,那么一样,我们的Linux的像脚本编程也跟这差不多,也是有一套语法语言的规约,然后呢,嵌入一些Linux的命令来进行。复杂功能的处理和调试,那说白了,比如说我在某些场景下面,我要求多条命令。在某种判定条件下。能够一号条件执行一号命令,二号条件执行二三号命令,三号条件执行456号命令,或者我们现在需要对外界有个入口传参,那么各种参数的传递、判断、循环,甚至也就是说结合这些语法规约嵌进去我们的Linux命令来完成我们的重要工作。那么这样呢,都可以把它统称为宏观上啊,粗糙的数位呢,都叫脚本,他那R呢,是用标准的资源编写,并以源代码的形式开翻开那个开放的,其设计的目的就是为了嵌入应用程序当中。
49:27
从而为应用程序提供灵活的扩展和什么定制功能,哎,要的是这个,这门语言呢,是巴西的里约热内卢的天主教大学,他所编写的啊,巴西的,一般我对巴西的了解就是足球啊,第一次学这个时候说,哎,这个巴西啊,还产生了这么一门比较小巧通用的脚本设计语言啊,好,目的就是为了嵌入式程市里面,说白了。把我们的red命令用rar脚本包装,然后用red来调用,或者把这一套综合型的red命令跑在我们的red服务器上面,从而增加我们red命令的复杂功能和条件要求,OK。
50:10
所以呢,这些呢,是它的简单的一些介绍啊,我们就不再过多的展开,那么下面一句话。我们这6.0版的改进点需要把这个衣服判断和我们的delete塔合二为一。哎,通过前面介绍增强red的命令,因为现在这个判断get和这个delete塔,它100%red原生的话,它没有这样一套命令,能够把两个捏一块,那么这个胶水,这个黏合剂靠谁就靠入R脚本,因为人家是嵌入式的,天生就支持,所以参考官网,那么同学们。打开我们的red官网,专门有一张模式设计,这叫distributed lock red对分布式所的支持,OK,所以我们找找找找找往下这个后面我们下一章讲什么red lock红锁的时候请大家看啊,先提前剧透一下,就当是看也看到了,有没有发现Java实现的red sun,也就是这个有点相当于list接口的一个规范,那么天上飞的理念,也就是接口规约和规范必然而然有落地的实现。所以说write为什么功生态丰富,功能强大,你看看多少语言都可以支持。
51:31
OK,所以说Java只是其中一种,那么到后面下一章啊。手写write整完了,我们就会来研究一下WRITE3OK,工作中这个非常好用,好,那么接下来言归正传,找到我们的分布式所,那么大家请看。咋整?OK,所以官网上就告诉你它呢需要用这一段脚本,那么请大家看get,然后就算没有学过R的同学,就从这儿是不是也大概能看得出red调用get某个命令,这个K一百分之百视角中某种参数如果等于我们的。
52:13
这个A1的话,那么Z我就要调用delete这个命令,那么请问是不是跟我们这儿这个get,如果这个T等于这个。参数一且等于我们传进来的这个参数一的话,给我调用这个比delete塔,否则的话就是零,那么由于前面的介绍,撸啊,是用谁编写的啊,是不是用什么东东C语言编写的,那么除了true false本身以外,人家是不是还用一?代表删除成功处零代表false,没有删除或删除失败,OK,所以呢,到最后我们会明白,在这儿官方推荐我们对于判断和删除建议用路R脚本来解决,OK,那么好,接下来我们就要对撸R脚本的语法编写做一个简单的介绍。然后保证大家。
53:14
够用,最终我们结合成我们的ready代码来解决,好吧,限于课时的关系和这门课的主要是介绍,所以路R脚本我们只是介绍到将将够用,有兴趣的同学请下课以后查阅其他资料,OK,好,那么同学们,接下来我们就来hello word开始录R脚本入门。
我来说两句