00:00
在刚才内容中呢,给大家演示了超卖问题,还有连接超时问题,咱们通过连接池,包括乐观锁把问题都给他解决了,但是其实我们的操作中呢,还有一个最后一个问题,这问题是什么呢?它叫做库存的议论问题,那问题是什么?给大家先演示一下,然后咱们来说明一下,最终把问题再给他解决掉。首先我来演示一下,咱们先来到read中,在ready里边呢,我先把这个user,这个key先给它删掉。这个删除,然后再设置一下,就是我们这个库存的这个数量。比如说咱们之前都是石墨,现在为了有效果,我给他改成比如这个500,让他有这个结果,然后咱们回车,我们再来查看一下SK0101。QT里边500这样的话,咱们把这个值给它做了一个调整,然后调整之后呢,下面怎么做呢?我们在里边还是来用AB工具模拟多个请求过程,比如咱就模拟2000个请求,然后300个并发,通过它,咱来看一下目前会出现什么问题,但这问题呢,我们测试中可能你测试多次才会出现,因为它的问题可能一次测不出来,所以咱们多测试几次,把问题给各位点出来,那我现在把它回车,我们来看一下这问题所在到底是什么问题。
01:33
然后现在这里边在发送请求,它已经完成了,就是2000个请求都已经做到了,然后咱们来到re中,我们通过get来查看一下里面的过程正确效果,里面的库存是不是应该是零啊,因为你已经秒杀完成了,应该是结束了,但是我们看一下现在这库存值到底是不是零,咱们回车大家看到问题了吗?目前多少是不是有393个库存,等于说你这个秒杀还有393个商品没有卖掉,这个问题叫什么?就叫做库存的一个问题,所以现在这问题给大家就点出来了,那这个问题呢,为什么会出现,给各位来分析一下啊,大家来说一下。
02:19
给大家强调,这问题呢,是因为我们的乐观锁而造成的一个叫库存。遗留的这么一个问题是它造成的,那什么叫库存遗留问题呢?咱之前说到了,比如说给大家举个例子啊,比如我们现在有这么500个商品啊,注意是500个,那500个商品目前有2000人是不是要去秒杀或者要抢这个500商品啊,比如说现在啊,我这里边同时有这个,就是比如说同时有2000个人都抢到了这个500个商品,那最终他是不是要进行提交或者进行购买,进行操作呀,而最终因为咱有乐观所,乐观所的特点是什么?就是比如说我2000个人中的有一个人,他最终就是做这个购买,然后他购买之后是不是要修改一下你那个。
03:12
版本号了,而他修成版本号之后,比如说默认版本号是1.0,他修改之后变成了1.1,那剩下的1999个人版本号一比较是不是都不一样了,那那1999人是不是都不能再往下做其他操作了,所以这个问题就叫做库存一个问题。也就是说因为版本号不一致,就算我商品还存在,但是因为版本号不同了,所以你也就不能再往下进行购买了,这个就叫库存一个问题,不知各位是否能听懂啊?咱之前演示过,比如我这个2000个人抢到500个,那这个时候呢,我其中一个人购买了,也提交了,他提交之后把版本号改成了1.1,然后剩下的人一比较,版本号是不一致的,就算我商品还有剩下人是不是也不能购买,这就是乐观所造成的问题,叫做库存一个问题。
04:09
这是我们做一说明,那这个问题我们该怎么解决呢?大家想一下怎么解决,有同学可能马上想到要用非观测是不能解决,但是一个问题啊,Ready中呢,默认不能直接使用悲观锁,它只能直接用乐观锁,所以这个我们做不到,那怎么解决?里面有一种比较典型的方案,大家看这个方案啊,用一个脚本源叫做落脚本做到这是一种脚本源,这个大家要有个了解,那这落是什么呢?看一下里面那个描述,这里写到啊。就是落呢,是一个很小的一种脚本源,它可以直接被C或者C加加调用,也可以反过来去调C或者C加加的函数,它本身没有函数,只是互相做调用,另外它这解析很小,只有200K,而这个用Lu我们能够作为嵌入式语进行开发,但是它本身并不独立使用,所以我们现在就可以通过一个嵌入式的落言来解决这个库存一个问题,用它可以做到。而洛呢,就是诗句中有很多场景,比如说一些什么嵌入式的游戏的外挂,一些插件,落经常做这开发,这各位给他知道一下。
05:27
另外Lu呢,在我们的red里边有它的一些优势,什么优势呢?大家看里边一个描述啊。首先我们可以将复杂的或者很多步骤的ready操作写成一个落脚本,然后依次调给ready执行,减少反复连接次数,提高性能。而这个过程中呢,落脚本在执行的时候不会被其他命令插队,它可以完成一些ready中的事务操作。但弱脚本还有一个特点,只支持RA。
06:01
2.6以上的版本才能用,因为咱用的是六级版本,所以肯定可以使用,但是如果你用的是2.6以下版本,那都不用用落脚本,落脚本能解决我们的超卖问题,所以这是关于它的一个描述,那这句话什么意思呢?咱说的通俗点啊,比如我现在在做这个秒杀操作中,咱是不是两步,一步就是减少库存,一步就是不是就是增加我这个用户的这个清单。那两个操作呢,怎么做?咱可以写一个落脚本,当我落脚本一挑给red,那red呢,他就把这脚本直接执行,中间别人不能干预,你干预也没用,我只有执行完成之后才能干预,就是我在执行的时候别人都干预不了,把它执行之后别人才可以做操作,这就是他的一个特点,我一执行,只有我接触之后别人才能干预,我在执行过程中,别人是不可能对我的操作进行插队的,他也不可能进行干预的,这就是脚本一个特点,所以咱们ready里边经常用落脚本写些复杂操作,或者说一些多步操作,因为它能解决很多问题,咱们目前遇到这个就是。
07:14
库存遗留问题用落脚本能解决,或者说超卖问题用它也可以解决。所以这个是我们提到的这个落脚本,那这怎么用呢?给各位说一下啊,这个不需要各位能写出来,但是要求各位能给他看懂里面过程大家看一下啊,在我课件中的这个地方有一段落脚本,那脚本咱来读一遍啊,就这读应该并不复杂,咱们看首先第一行,第二行local uidd case1 local product idk2。什么意思,它就表示啊,咱们定义了两个变量,然后里边需要传入就是两个参数,第一个用ID,第二个上面ID,然后看这两行大家说什么意思。咱们在Java代码中是不是拼接过它的key,而现在好比说我们在落里边也拼接这个库存key,还有你的用户key,跟之前一样,而除了账之外,下面这个过程怎么做?Red Co表示啊,去调用red中的命令,判断你的一个用户在目前的清单中是否存在,就是调这个ss member,咱代码中是调过,现在是在落脚本中做这个调用,也就是里边的。
08:30
这么一个过程就这里啊,它是通过落脚本调用,然后掉的过程中,里边判断,如果它的值是一,那我们瑞吞二,瑞吞二什么意思呢?是我们一个约定,就好比说我们现在这里边我已经秒杀过了,那就瑞吞二,这表示已经秒杀到商品,你不能再秒杀第二次,然后第二部分呢,判断库存,掉钙的方法得到库存,如果库存小于等于零,那表示什么?就是秒杀结束,比如说零表示秒杀结束了,如果说秒杀没有结束,那咱怎么做?那就是减库存,添加清单,最终就是秒杀成功,这就是一段简单的落脚本,我再重复一遍啊,这里边的二就表示我们当前这个用户已经秒杀过了,零表示秒杀就是已经结束了,一表示秒杀成功。所以大家看这一段脚本跟我们写的Java代码应该是类似的,只是他用落方式。
09:30
把它做了一个实验。而用它就能解决这个库存一个问题,这各位给他能看懂就可以了,然后这个写完之后,然后这个代码在我们的项目中该怎么去用。我们来看一下啊,首先在里边呢,我在这位置已经写好了一个类,这个类叫RA by script的,然后这一段呢,就是一段落脚本,给大家看那个落脚本,然后在下面这个位置,我们首先连接池,然后通过一个方法叫script load加载脚本,通过这里边一个叫EVS这个方法,然后把它加进来,这里边包括它有数量是二,然后传入UCIID上面ID啊这个固定写法,然后最终就是各种判断,比如说是零,那就是已抢空,一抢购成功,二已经抢过了,然后其他情况都是抢购异常,最终把这意思关闭。
10:26
所以这就是一段最基本的使用,各位能看懂可以了,也就是里边在这位置调用落脚本,解决库存一的问题,然后这个做到之后,咱最终呢,在这里边给它调用一下,那咱把这个代码给它改一下啊,改成调用我们刚才这里边的方法,我们改一下应该用的是这个read by script里面的方法,传入用户ID和这个上ID,用户ID商ID在下面就是做这个各种判断就能得到,所以这是关于落脚本在里边的一个具体使用,咱们把它在里边就用进去了。
11:07
然后这个使用之后呢,最终咱们把效果我们来做个测试,通过它看一下,这个就是库存遗留问题能不能解决啊,那我们来试一下啊,首先我把这个服务器给到咱们先重启一下。给他做一个启动啊。啊,这里边啊,我用这个重启啊,重启一下啊。然后重启之后,咱们还是按照刚才的方式,用AB工具模拟出多个请求,看有没有刚才问题,因为刚才我们发现问题是存在的啊,里边有这个就是几百个,那咱们把数据先调整一下啊,首先先删除一下这个就是。User的这么一个K,然后把这个就是库存的key给它设置成这个500,包括咱们可以先看一下哈,Get sk0101QT目前是500。
12:06
然后现在呢,咱们通过AB工具模拟一下过程,咱们还是用2000个请求,300个并发,然后看一下它最终的效果到底是怎么样的,那咱们现在给他就模拟一下啊,我在里边回车,咱们来模拟里边的这么一个基本过程啊,就等它最终实出来,那我们给他等待一下啊。好,各位看啊,目前已经执行完成了,然后这里边我们再看一下这个ready里边是否还会出现那个库存一的问题,那咱来查看一下啊,大家看目前值是不是零了,它就没有出现,就是我们多个没有卖掉的问题,就是库存的问题,但是这个你可以多试几次,但是效果应该一样,因为咱们用落脚本这个问题可以最终解决,各位也可以自己在练习的时候把这个多试几次,最终看一下这问题是否解决,目前是肯定可以解决掉的,所以现在呢,咱就通过这个落脚本解决了库存一个问题,这些问题我们就最终完成了。
13:13
然后完成之后呢,咱们到这里啊,就把位置里边这个事物,包括所这部分给各位,就最终也是完成了,然后最后把这些内容给大家来总结一下,咱看下这个特点啊,首先第一个大家大家记住。Re,中的事物里边这个基本的定义,包括里边的这个过程,咱需要组队执行cut discard。另外这里边两种锁,一个乐观锁,一个叫悲观锁。ready中用乐观锁就是通过版本号解决问题。在里边需要用watch进行监视,然后做操作,然后咱们最后呢写了一个秒杀案例,模拟一下这个过程,秒杀案例中呢,咱一共写了这么一个版本,我这里都列出来啊。第一个版本就是普通版本,这版本中在并发中会出现库存负数问题,然后第二个咱们加了乐观锁,解决了这个超卖问题,但是出现了这个库存遗留和连接超时,连接超时呢,我们用连接池解决最终的库存遗留,通过落脚本把这给它就解决掉了,所以这是我们演示到ready中这个事物相关的操作,最终秒杀力邀各位能给他自己点出来。
我来说两句