00:00
我们的这个分布式锁里面,我们要去释放锁。首先呢,我得要通过get的指令,可以查询一下里面这个loft的值。Lot值,哎,是不是和我我动态传进去这个UID一样的啊,我现在这个UD呢,肯定动态传到脚本里面去。然后来判断是不是跟他一样。如果一样要进行第二指令,那就把这个锁给它释放掉。好,来看我们的需求是什么样子的啊,咱可以呢,借助于这个呃,记事本啊,来去写一下啊,因为呢,这个可读性呢要高一点。那我们要做什么?做判断是图自己的所,判断是否自己的所。那么如果是自己的所。那我要去执行删除操作呀,执行删除操作,那这里呢,还有一个难点是啥呢?难点是我怎么拿到自己所得值。我怎么以执行啥呢?在R脚本里面来去执行release指令。
01:03
啊类指定,比如说执行先执行查询指定。判判断一下是不是我我我要的那个值。好,那么咱再。啊啊ready要进red指令啊,我们要通过他们通过这个一吧,那咱们red呢,像鲁啊脚本主动暴露了一个类库啊叫red一个类库。然后call,通过call方法,它就可以执行咱们的release指令了。那么这个指令要执行哪个指令?那你要写个指定名称,第一个参数就是指定名称。那么要执行的指令你啊基盖的指令,那要获取谁呢?啊第二个参数呢,就啥呢,就是你的这个K了啊,比如说我要获取一下这个,呃,Lock锁的这啊log锁,那咱最后呢,我不需要弹什么参数。那我这个前面啊,最好来一个看看还能不能拿到这个log的值,因我一回撤来没有没有拿到应该lock锁的值呀,就不存在的呀,我给他设计一个loft锁啊,比如来一个呃这样的一个,这就是我的UID嘛,对啊,我想把它给弹生出来。
02:09
那咱可以使用使用这个一吧,再去回到那个一八亭里面去,那现在我已经有这个lock了,看能不能给我查询出来呢,可以回撤可以查询出来了啊。它就弹出来了。那么咱所有指令。那都是通过release点扣来执行的,那release点扣这个方法里面这个参数怎么写呢?啊,它的顺序啊,写的顺序啊,就跟我们指定的顺序是一样的。比如在外面我要查询lock锁的这个,呃,值必须是get lock嘛,哎,那么我们这里面的参数呢,第一个参数就是指定名称,就是这个get,那么第二个参数呢,就咱这个lock了,哎,所以呢,字面参数呀,跟我们指令的这个顺序是一样的,第一个参数你指定名称,第二个参数是K的啊,K的值啊,K的名称。
03:01
那么也说我们在R脚本里面没有执行S指令的话。哎,那么它执行顺序呢,那这个参数顺序啊,也是跟set指定的顺序是一样的啊。第一个参数应该是set。第二个他说的是lock,第三个他说是UUID,那比如说呢,我来去进行一下,来一个依法指令。那么来一个return啊,或者说呢,我就啊就吧啊来一个啊read点上扣我执行啊set指令尽要来一个set第一个参数啊,就你这个set跟这个顺序是一样的啊。那么第二个参数呢,就是你的K的名称对吧?啊,咱不是lock吗?应该写进去,那么第三个参数呢,是你的UID,那我可以呢,再随便搞个UID写进去啊,就这样写。好,那么写好之后呢,我们再来看啊,大家有没有,嗯,有没有动态传递的参数呢?现在还没有,没有的话,我就直接写个零,他一回撤他们就写好了。那么写好之后我们再来去,呃,看啊,那eva指令啊,我们就可以去执行RA里面的这样的一个内部指令了啊。
04:08
内部指令了,哎,那么在很多时候。很多时候那我这个锁的名称可能不固定的,比如说呢,在我们的减库存这里面,我有一个lock锁啊,就叫lock。去掉。那我其他地方呢,也可能会用到分布式锁。如果都叫lock的话,那相互之间不就锁住了吗?所以呢,往往我们的锁的名称啊,可能不固定。那在这个地方我使用飞母热索,索的名称叫lock,在其他地方也会也会使用到分母索。但是我锁的是不同的资源。那相互之间呢,不应该锁住呀,这些锁的名称可能就不一样。所以往往呢,我们所的名称啊,会动态传递进去,那么这UUID每个请求都不一样,那我可能也需要动态传递进去。那这两个参数咱都需要动态传递进去啊,一般都要动态传递进去。那么咱怎么传呢?对吧,我们既既要有指令又要传参数了,比如说我可以传一个参数,我把这个log锁的动态传递进去啊,那么还有这个UID,我也可以动态传递进去。
05:11
啊中传递进去,那么然后呢,咱们再回到这个R脚本里面去,那么这个地方呢,咱们呃主要去写啥呢?写这个呃写这个动态参数了啊,那么咱的这个所的名称啊,一般要通过呢,通过这个K来传递啊,来一个case啊这样的一个一,这样个一啊传递进去,我们习惯上啊。啊,K的话呢,通过。啊,KD结构的K啊,通过K来遗传。那么这个值呢,Y6呢,咱通过阿格来传啊,咱通过阿格V那么来去接收来一个阿格V1不就可以了吗。好,那我又回车啊,你已经设置好了,那么设置好之后啊,来一个get,查看一下这个log,你现在现在就变成我们这个新的这个UID了啊,那跟我这个UID是一样的。
06:03
啊,这假装这个UID啊,跟他一样。好,那么咱会了这些指令之后呀,我们来看一下咱们的这个分布式所里面这个R脚本。那该怎么去实现,那由于呢,在这个画图工具里面啊啊看起来呢,可能不够对齐方式不够好啊,所以我换成呢这个note派D加加来写一下。那我们的罗马脚本应该是这么写,来一个A判断,来1A判断行类执行ready,点上po,我要去执行这个get指令,可以查看一下我锁的UID。来送的UID,比如我查看下这个lock锁的这个UID。那么是不是等于我当前这个请求的UID,哎,如果等于了Z,那我应该直想到。啊,执行等于一个删除锁的操作,来个ready点上来个Q来以执行第啊。
07:00
可以删除我们的锁,BL指令删除我们的这个lock lock锁哈。那么然后呢,我们来一个,嗯。啊,Return return,那么如果比第二指令执行成功了,它会怎么样,它也给我们来看一下啊,来一个第二指令,如果勒锁成功了,它又给我们返回一个一啊这个玩意儿。好,那么如果嗯,如果这个嗯不相等。那带呢来一个I,所以直接去return return0就行了呀,对不对啊,RETURN0就可以了。啊,那么如果执行成功了,是我的所我进行删除操作,最后返回的是一个一。啊,如果不是我的锁,我就平个零,啥都不用干就可以了,平就行了。好,最后呢,把代码结束,来一个N。当代码结束之后呢,我们再去测试一下咱们这个R胶呗,那么好不好用。
08:00
啊,那么咱这里呢,要先分析一下了,那我这个挂脚本kiss。啊,K列表有那些啊,那么K列表呢,咱是有啊,我把这个lock锁,Lock名称啊,K的名称给它放在K里面就可以了,那么还有这个UUID,那么UUD呢,咱们不要给它放在这个啊二列表里面去啊,那这个呢,是咱的这个UUID放这个二列表里面去。那么也就是说咱这个地方将来在鲁瓦脚本里面,我应该是通过K1来去获取的,那么然后下面这个地方呢,应该也是一样,咱应该是一个啊CASE1,那么这个地方呢,咱应该啥呢?应该是我们的ugly啊UY咱们是。一这样子。好,那么然后呢,咱还得要把这个辣脚本稍微处理一下,换到一行上面去,因为在我们这个里面啊,那咱这个在一行上才好去执行啊,啊为了方便执行,咱给他放到一行上面去,来处理一下。
09:03
呃,处理好之后啊,我们就可以放在呃一吧责任里面来给试一下了啊啊给它拷贝过来,让他放在我们的呃这个里面来一个eva指令,好把我们的va脚本呢给它拷贝进去,那我要传一个一个K啊,咱一共是只有一个K,当然这个K呢,它就是一个lock,那么UID呢,我可以随便写一个啊随便写一个,那么此时有我这把锁吗?这就没有锁呀,没有这把锁,所以呢,反应只能是零。那我可以呢,去set一个锁,Set lock,然后我这个UID呢,我随便写一个,哎,那我有这个锁吗?但是和我这是是我要释放那个锁吗。它俩一样吗?是不一样啊,哎,我要释放的不是当天这个数。那么它能释放成功吗?来再进行这个螺胶杯A释放素。那么释放失败了呀。因为这个锁虽然有,但是不属于我当前这个请求的所。
10:02
所以呢,大家最终呢,也是释放所失败。你啥都不干对吧,就不用去十方所了,因为不属于我呀。啊,那么如果这个锁就是我的,比如说呢,我把这个呢。给它拷贝一下,让它放到我这个瓦脚本里面去啊,给它放到这个罗R脚本里面去,哎,那么我这我要释放到锁。啊,就是当天这个所,或者说呢,是当天这个所呀,就是我的所谓啊,那么咱这个罗化脚本呢,就可以去释放掉了,你反应值是一,最终我们这个水呀,它就没有了哈,Get lock它就没了。好,就咱们这个,呃,撸R脚本的一个实现就实现出来了,那这种反应在代码上大该如何去写呢。好,我们可以在这个地方呢,来去写一下啊。啊,把这个代码呢,咱给它注释掉。那虽然我们这个代码呀,已经写的是呃,比较完美了哈,很多公司就这么去玩对吧啊,但是呢,咱还可以做的更好对吧,我们可以领到比别人做的更好一点。
11:02
那首先呢,我得要把这个落脚本呢,给它定义进去啊,让string来一个script,等于啊把我们的脚本给它放到这里来,但辣脚本呢,我们就是。这一行代码呀,给它拷贝过来,让它放在这个位置,那放进之后呢,为了方便阅读啊,咱可以呢,稍微处理一下,比如咱可以换一下行,那么if这个成立,咱怎么怎么样,对吧?啊执行这个DL指令。那么A如果你不成立,我就直接成一个零啊,就可以结束了啊,最后呢,是N的整个代码块结束它这个多脚本呢,就这么简单。那么来一个雷似点ready塔点上,然是X。X应该有cut cut这样的一个方法,你看里面呢,就可以接受一个rabbit脚本,那么之前呢,我们玩过sitting call back,那它这里还可以接受一个脚本。你也可以像这个release脚本里面来以传你的K列表,可以还有什么阿格列表,你可以就传哈,可以使用这个方法。
12:08
那么第一个参数呢,来看啊,它需要什么参数,那么应该就是这个了啊,第一个参数还需要一个RA script对象,那这是一个接口,我们肯定不能接入接口。它有没有什么具体实现呢?来看一下,也只有一个实现,叫default script。那么也就是说咱没得选,我们就只能去使用它了啊,那就选择使用它呗。那没了线,我们就只有defat ready script,咱就new一个deat ready script,然后把script脚本呢给它放进去,那放进去之后,那我们肯定还有这个kiss列表。那么case列表来看一下,它需要一个什么类型的参数呢?需要一个集合类型的参数,那么集合类型的参数呀。好,那我们可以呢,来一个呃,Race啊这个工具类,来去搞一个集合。
13:00
弄的K列表只有一个啊,就叫lock,咱把这个lock呢,给它放进去。那么还有呢,是你的二格列表,那么二格列表它是一个不定参数,那不定参数就很容易了,你可以直接写在这个位置就可以了,你可以一个个的往后面去写,以逗号定的分格写在后面。你也可以写,那写啊是数组啊,对吧?啊,那比如说呢,我这里就只有一个UID,你就直接写个UID就可以了呀,给它放在这个位置。好,那么咱们这个呢,诶我就写好了。那我也不关心他的什么法规值对吧,反正你执行了。啊,你这个存在我就删掉嘛,那不存在呢,我就直接就结束了呀,这个掉呗。该见谁就可以了。那么好不好用呢?我们把这个服务,把这两个服务给它重启一下,我先重启服务二,让大家又重启这个服务一啊。一当然,我这里呢,有这个run byboard,我也给它调出来了啊,我在这里重启呢,会更加方便一点。好,服务二呢,已经重启过了,那那是服务一我们也重启一下。
14:06
呃,重启好之后呀,我们在浏览器上呢,来去访问一下啊,来刷新怎么样呢?哎报错了,诶这什么错呢,我们可以看一下啊,啊,它应该是访问到符二这个里面去了,来看这是什么错。那看下这个错误信息。啊,说这错误信息啊,他说呢,嗯。而不支持的操作异常。啊,不支持的操作异常,然后状态。啊,状态异常,什么东西不支持。什么set along,什么不支持,对啊,不支持。好来看一下这个上面这个异常演习啊,他说呢,嗯,状态输出,呃异常,因为这个啊,他说不支持。啊,什么赛浪那个玩意儿。好,那我们来看啊,到底咋回事呢。那你可以认为这是一个bug啊,这个地方呢,虽然给咱提供了这样的一个构造方法,就这个release脚本这个方法,这个这个东西啊,但咱提供了一个脚本的构造方法呢,一般呢,不要去使用这个,因为你使用它呢,就会导致啊出现异常。
15:13
你一定要指定法规之类型。不然他就会爆含了,就会爆输出异常。一定要指定反义词,这反应词啊,就是你要这个落脚本输出的一个参数类型啊。OK,那么咱这呢,比如说我就可以输出啊,随便写一个布尔类型,反正我也不关心这个反应结果啊,我就随便写一个。那么下好之后呢,我们再来重启我们这两个服务啊就可以了。嗯。啊,重启呢,应该都没有问题啊,都已经重启成功了啊,那我们再来去访问一下。好,来看已经成功了。那么成功过之后呢,来看我们的库存啊,来一个get stock,我好像没有设置过库存,它依然是零啊,虽然是零,但是呢,它控制它这个页面没有报错,说明代码写的没有啥问题。
16:06
那我们呢,可以去set talk来设置为5000,然后呢,打开压力测试工具来执行压力测试。好,最终我们可以看到我们的吞吐量呢,是550左右啊。好,那我们来看最终库存余量是多少,那我们来一个啊,Get stock,那我们可以看到已经减为零了。那说明它确实可以防止超卖现象,那么代码改造呢,也没有任何问题。嗯。那么这个性能啊,咱其实还可以再压一下试试啊,看下最终效果怎么样啊。好,我们再来去运行走。好,咱们上一次呢,给它清空掉了啊,来看到啊,有将近700的这种并发量啊,600多的并发量。
17:05
啊,那么这个效率呢,其实还是能够接受的。
我来说两句