00:01
下面呢,我们继续来演示秒杀的案例,刚才呢,咱们通过AB的工具模拟出了并发效果,最终出现了两个问题,第一个问题就是超卖问题,就是我这个商品已经秒杀结束了,但是我还能够秒到商品,然后第二个那就是连接超市问题,那咱们下面呢,把两问题给各位来解决一下,咱们先解决一个简单的就是这个连接超市问题,那咱们解决呢,就这个过程很简单,各位之前呢,在学这个数据库买so的时候,应该学过一个叫数据库连接池,而咱们现在解决这个连接超时,也可以用连接池来解决一下,那怎么解决给各位来说明一下,首先我在这里边呢,给大家写好了一个工具类,这工具类呢,不需要各位再写一遍,咱们直接用就可以了,这就写好了一个关于JD的一个连接池,那我们看一下这个东西是怎么做的。
01:01
首先在里边我们有个类,就这个叫get date it tens,然后在里边就设置一些新闻内容,包括你看内容中加了一个SNE关键字,加了一个锁,然后在里面设置就是里边这个连接池的配置,包括你的最大的连接数,包括你的等待时间,以及里边这个就是超过这个是否进行等待,以及我们里边的这句话大家看啊,这是什么意思呢?就是我从连接池中会连接,需要测试一下连接是否是一个连通状态,就是设置连接池中的一些基本信息。然后设置之后,最后来new,这个就是连接池,在new的时候呢,里边传入这个参数,就是第一个是你这个基本配置,然后第二个是IP44.168,第三个你的端口号,第四个就是你的超时时间,比如咱们超过这些时间,它就不再停服了啊,这是一个超时时间,所以这是一个连接池的一个工具类,给各位做了一个说明,包括最后还有一个释放资源的,然后这个工具类我们看到之后呢,咱们可以把我们那个例子给它改一下,怎么改呢?也就是把我们里边的这个地方。
02:10
大家看啊,这个地方是不是直接扭这个JD,而咱现在通过这个连接池得到这么一个JD的对象,那就是把这部分给他改造一下,那这里边我来写一下啊,咱写到这位置。我们就是通过连接池得到这个JDC这个对象,那怎么得到呢?咱们用这个JD po u,然后在里边有这个方法,这个方法,这个方法返回的是一个j po这么一个连接池对象,然后咱们通过这个连接池对象可以得到这个G地子这么一个对象,那我们来得到一下啊,就这个get resource,然后它返回的就是这个。地址。所以这就是连接池的使用,咱们通过连接池就能解决这个连接超时问题,就是里边的这么一个过程,这各位得知道啊,跟我们之前学过那个数据库的连接池基本上是类似的,那这是第一个问题,用连接池来解决,然后这个不是咱要主要说的,我们主要要讲的是什么呢?就是里边这个超卖问题,这个大家要详细说明一下,那首先我们看一下超位问题,大家看这张图上不是各位是否有印象啊,咱们最开始说那个就是。
03:30
我们那个商品买的时候,咱不最开始讲事物中是不是说过类似的例子,这例子是什么呢?就是你的多事物之间互相目前产生影响,因为咱们没有加事物,比如你第一个操作减一,然后第二个取到减一之后的数据,再减一,再减一等等,最终造成你的值可能出现了负几的情况,跟我们最开始说事物中等就是这个例子应该基本上是类似的,比如说我们看一下啊,刚才咱们曾经举过就是这个例子,比如说我们这个。账户同时去抢购,然后多个账户这里边我们进行操作,最终这值出现负值。
04:05
而目前超卖的过程就就是这个过程,它里边因为没有加事物,然后你之间多个操作之间互相产生影响,最终值会出现复制情况,我的商品已经秒杀完了,但是我还能秒杀成功,这称为叫超卖。那问题怎么解决呢?咱之前说的解决方案,通过乐观锁方式能解决,就加个版本号,然后每次操作判断版本号是否一致,一致的话操作不一致的话就不进行相关操作,之前咱通过一个叫watch,包括里边就这过程是不是解决过,那下面呢,咱们把这过程在我们的代码中给它做个体现,咱们看这该怎么去做。那我们来写一下啊,首先第一个呢,因为咱们操作中,你看这行干什么,是不是判断你的库存呀,所以这里边我们先做一个操作,把库存先做一个监视,或者说做一个watch,就是监视一下我们这个库存。
05:07
然后怎么监视呢?在这D里边有个方法叫这个watch,然后在里边加入咱们这个库存的key,因为它要不断发生变化,对它做个监视,这是咱们的第一部分,然后这个做到之后咱往下看,下面做的是什么呢?那就是你这个真正的秒杀过程,秒杀过程中咱要做两操作,第一个就是库存减一,第二个把它放到你的清单中去,而这过程咱需要把它加到咱的事物中去,那怎么加,给各位来写一下啊,首先我就我写下边啊,首先里边的第一个。我们用JD里面一个方法叫这个mart啊,Marty这个方法就给它加到这里边,我们这个叫marty transaition,其实就是把摆一个事物,然后咱下面做什么操作。各位应该记得啊,我这里加固注释,就好比说我们现在我们使用这个事物,然后使用事物之后,咱们首先做的是不是一个组队的一个操作呀,把它放到队列中,最终是不是在做一个执行嘛,所以咱下面做个组队,那咱们组队用这个R里边这个方法,咱做个组队。
06:21
那咱们来给它写下啊,首先第一个方法呢,我们要做一个就是把它库存是不是给它减一啊,那减一用这个叫就是音可瑞啊,就第一可瑞是减一,因可瑞是加一,我们现在要减一用的是。低可瑞,然后在低可瑞中加上咱这个库存的K,这是我们做的第一个组队,然后第二个呢,我们需要把里面这个值加到咱们那个就是成功的清单中去,用mart里面这个方法叫sad。里边加上它的K,加上它的UID,所以大家看这两步是不是就做一个组队的操作呀,咱把它进行实现,然后组队之后最终对吧,它要执行,我们用market里面的方法叫excute,这里边就执行了,执行之后大家看啊,它返回的是一个什么,是不是一个例子集合呀,然后例子集合中呢,其实由我们最终这个结果啊,就是result,那这结果呢,咱可以做个判断,咱之前曾经测试过啊,MAT里边呢,如果这个结果它等于空,或者说这个结果中有其他情况,那是失败。
07:34
否则的话才是成功,所以咱们做一个判断。那我写一下啊,就是里边这个result,如果说它等于空啊,或者说啊result.size。它等于零,那表示失败,失败的话咱们做个输出,比如写一下说这个秒杀失败啊,咱做一个输出。
08:00
然后秒杀失败的话,咱也可以把这个JD啊给它就关闭一下,然后最终瑞吞一个force。这句话目前就不需要了啊,所以我们现在把它就加到事物中,否则表还成功。所以这是关于我们解决超卖的问题的解决方案,通过乐观所解决,先watch监视你这个key,然后在里边把它加到事务中去,我们进行组队。最终执行,执行过程中,咱们给他做这么一个判断,然后最终得到咱们最终这么一个结果啊,所以这是我们完成的这么一个解决超卖问题的这么一个过程,咱们就做到了,然后这个做到之后呢,最后呢,我们把这过程呢,咱们来做一个测试,看一下咱们加上之后这个问题能不能解决,因为刚才测试过程中是会出现这个负值的情况,但是目前我们用的这个就是事物方式解决了,大家看这问题最终能不能解出来。
09:02
那我现在把这个服务器,咱们给它重启一下。然后咱们给它最终解决一下哈,现在我把它重启一下。然后重启之后,咱们还是通过这个AB工具来测试一下里边这个最终的过程啊,那我们现在啊,比如说我先到这个write里边,把值给它先清空一下啊flash DB,然后清空之后我们先set一个值,就是里边这个库存让他值默认还是十。啊,给他塞一下啊库存。还是十,然后咱们看一下get这个就是。SK1010QT目前是十啊,包括里边没有用户,因为咱没有添加,然后这个做到之后,下面咱通过AB测试给他来试一下啊,我来到这里边,然后咱们我把这个AB测试过程给它先复制过来,就是里边的这段内容。
10:04
我把它复制,然后复制到我们的这里边来,下面咱一回车看一下它最终的效果是怎么样的,咱们最终试一下啊,现在我给他飞车,然后咱们看里边的最终过程是如何的。好,大家看目前呢,已经完成了请求,然后咱们再看一下里边的提示,大家看啊,这里边提示我们你看啊,它就不会出现说我结束,然后再出现秒杀成功的情况啊,它只会出现一个叫秒杀失败情况,然后咱们看一下ready中这个数据,就是咱们来一个get,这个SK冒号0101加上一个QT,大家看库存量是变成零了,就没有那个负值的情况,所以这样的话呢,咱们通过就是这种方案就解决了超卖,包括连接超值问题,给各位就这种解决了,然后咱们再总结变这个过程啊,首先这里边第一个连接超时,咱们用连接池可以解决。
11:10
然后第二个就是超卖问题,超卖怎么做呢?我们在里边通过这个乐观锁方式解决,第一个用watch先监视你的库存,然后把它放到一个事物中进行组队进行执行,这样的话把这问题我们就可以把它最终解决出来,所以这是关于我们演示问题,所以咱们现在呢,通过这个例子呢,给各位就进一步演示了一下这个乐观所它里面这个场景,包括最终的解决方案,这个我们就演示完成了。
我来说两句