00:01
各位同学大家好,我们继续来学习ready,刚才呢给大家讲到了中的事物,包括咱们说明了事物中的相关特点,以及提到的里边的乐观所包括悲观所等等相关问题,然后咱们下面呢给各位通过一个具体案例,咱们再来让各位感受一下re中事物的操作,那案例我们做什么呢?咱就来模拟一个秒杀的案例,让大家再感受一下ready中的兽头作,那案例怎么做?给各位介绍一下啊,就这个秒杀这个案例各位同学应该很熟悉,比如说这里边给大家分析一下啊,就这么一个案例。因为各位曾都知道啊,在我们这个很多商家嘛,他为了提高他这个就是用户的这么一个关注度,经常举行一种活动,而秒杀就是一个典型活动,在秒杀中给他约定在某天的某个时段,那这个时候呢,我出来十个商品,然后商品比如说原价是100块钱,现在我用一块钱就是进行这个秒杀,谁抢到那就是谁的,这是一个秒杀的过程,各位应该都感受过,而咱们现在就模拟这么一个秒杀过程,那怎么模拟,大家看一下啊,其实秒杀很简单,主要做的应该就是两个操作,第一个操作你的商品库存是不是要简易啊,第二个就是你这个秒杀成功者要加到你这个就是清单中去,两个操作这个各位老师我能听懂啊,我再说一遍。
01:33
比如说我现在啊,一共拿出来十个商品进行秒杀,那十个商品在秒杀过程中是不是会有很多人参与啊,假如现在有100个人参与,比如说这里边100人中一个人他抢到了商品,那他抢到商品之后,我商品库存是不是要减一啊,变成九,然后这个抢到商品用户是不是要加到这个秒杀成功的清单中去,以此类推,十个商品最终每次被秒杀到就减一,然后秒杀成功的人就加入到这个秒杀成功者的清单中去,就是它里边两个操作,一个是库存减一,一个是人数加一,这就是秒杀的过程,应该并不复杂,而咱们现在就可以通过ready这过程,包括把里边的库存。
02:22
包括把这个人员清单放到ready中,通过ready咱们就来模拟一个秒杀的过程,那下面咱们看一下这个该怎么去做。我这里边呢,给各位提前写好了一个项目结构,因为咱们只是一个模拟过程,最后就用一个最基本技术给各位写了一个结构,然后咱们重点写下,就是red中的,就是JD里边的切换代码,咱们把结构给各位直接提供出来,那我们看下这个结构怎么做的啊,首先在这里边,这是一个简单的外部项目,然后在里边有一个页面,页面中的里边就是有一个表单,表单中有个button按钮,当咱们点这个按钮,然后进行秒杀,一点按钮的话,它会提交表单到咱们这个中去,然后supply里边大家看,就是发送一个POS请求,然后传取的数据,最终做操作,然后咱们在中这示过程,因为咱是模拟过程嘛,最后这个商品我就固定让它的ID是这个0101啊,这是一个简单页面,然后页面提交,它会到我们的这个中去,这个skill。
03:32
然后在中大家看啊,这逻辑很简单,就是首先因为咱是模拟过程嘛,所以我就不真正登录了,咱们通过一个随机数生成一个ID,然后得到你传回来这个商品ID,最终调用里面这个方法做这个就是秒杀的这么一个过程,最终判断成功或者失败,然后咱们核心就是在这个方法中,咱们在这方法中写入咱那个秒杀的这么一个过程。
04:00
写一下啊秒杀的过程,那咱重点写到这里,这结构各位应该能看懂,就是一个简单的页面,然后有个表单,当咱们提交表单到so中,Sol中呢,得到数据,最终调单的方法,在方法中我们来实验一个秒杀的这么一个过程。这个是我们要做的事情。然后咱们下面在里边把这过程给各位,我就们来写一下啊,这里我来写一下,首先咱先写一下我们这个代码的一个基本步骤,大家怎么做啊,各位看到,因为现在呢,我要传过来两个参数,一个是用快D,一个是商品ID,所以第一步呢,咱做的严接点,先做一个就是这个UID和这个product的这个ID的这么一个非空的一个判断,如果说他们等于空,咱是不是就不需要往下执行,直接return for就可以了,因为你没有这个用户,你也没有上面ID啊,这是第一步,然后第二步怎么做呢?咱就可以啊连接上我们的radi。
05:07
就是用我们的JD做连接,然后连接之后呢,因为这个操作中我们会有两部分数据放到咱的radio中,刚才给大家分析到了,一个是咱们的商品库存。还有一个是你那个秒杀成功者那个清单,也就是你的用户ID等信息,所以咱第三步呢,咱就可以来,比如说我们拼接一下我们这个相关的K,把K拼接一下,然后K里边有两个K写一下啊,第一个是在那个库存的K。然后第二个是你那个写一下啊,就是秒杀成功那个用户,他的这么一个key,就根据ID我们做操作,所以这是我们的第三步,咱们拼接K或者后面操作,然后这个做到之后呢,下面进入到第四步,第四步呢,咱们就做那个就是秒杀的过程了。
06:00
那秒杀过程怎么做,大家可以想一下啊,咱们把判断写到完整点,比如说我现在进行秒杀,如果说你库存里边啊,比如说我们现在库存里边它的那个剩余的商品数量为零,咱是不是就不能秒杀了,包括如果你库存中目前没有数据,那我们可以提示他说那秒杀没有成功啊,所以咱们先做第一个判断。我写一下。就是来获取一下你的这个库存,如果说咱们获取这个库存。它本身就是等于空,那表示你这个秒杀还没有开始,咱们需要等待,然后进行开始啊,就是还没有开始,我们需要做这个事情,就是咱们直接通过red取到库存,如果库存等于空,那这时候提止它没有开始,这是我们的第四步,然后这个选完之后,下面进入到第五步,第五步做什么呢?大家想一下,比如现在啊,我这个没有开始,那我们提示它没有开始,当你秒杀已经开始了,咱是不是要进行秒杀呀,就是下一步我们就开始秒杀。
07:09
但是秒杀的时候呢,各位注意啊,比如说我的用户啊,是ID是一我已经秒杀到了,如果用户已经秒杀到了商品,是不是就不能在秒杀第二次,因为这里边你不能重复秒杀多次,一个用户只能秒杀一次。这应该能听懂啊,只能秒杀一次,所以第五步呢,就来做这个判断,就是判断你这个用户是否他就是重复做这么一个秒杀的操作,也是他只能秒杀一次,那怎么做,咱们可以从read中取,这个就是用户成功那个清单中的ID值,就是它那个值,如果能取到表示已经成功了,就不能再秒杀,如果取不到,那我们再进行还下操作。这是咱的第五步,然后第五做到之后第六步呢,那就是咱这个秒杀的这么一个过程啊,那我们来写一下啊,第六步,比如现在咱们也是判断一下。
08:06
判断什么呢?就是如果说啊,你这个就是里边这个商品的数量,或者说咱那个库存的这个数量,如果这个数量呢,比如它小于一了,或者说等于零了啊,或者说咱们这么写啊,小于一了,或者等于小于等于零了,那这个时候表示我这个商品是没了,就你已经秒杀结束了。这个啊,我们需要这个判断啊,所以这个代码其实并不复杂,主要是里边的大家要考虑到各种的情况,这都要考虑到,这是里边的第六步,然后第六步做到之后,那下面呢,就是咱们真正那个过程第七步。秒杀的过程,秒杀过程怎么样?大家想一下什么过程?首先第一个。如果说你秒杀到了,那这里边它的库存是不是要减一啊,另外我们的7.2,你库存减一之后,咱要把我们那个就是秒杀成功的用户添加到你那个就是秒杀的清单里面去,就是在re中加入剩余的数据。
09:16
所以这个就是我们写这个秒杀的一个基本过程啊,这里边我们要做出各种的判断,最终把这过程做个实现,这是一段分析的过程,然后这个分析之后,下面呢,把这个代码给各位,我来写一下,咱们按照这个过程就来完成里边这个具体代码。那我来写一下啊,首先第一步就是做一个判断。咱们加上一个E,就是如果说这个UID。它等于空。或者说这个product ID等于空,那表示咱目前就没有这个ID值,咱就给它直接吞一个force,就让它不进行下面操作啊,这是我们的第一个这行判断,然后第二步呢,咱就连接一下我们那个RA,通过J做连接之前咱都写过,我就直接给它谬一个DDS,然后里边两参数第一个你的IP地址我写下啊,幺九二点幺六八点四四点。
10:19
168。后面加上端口号。6379这样的话,我们通过JD就连上了我们的reddi,然后连上之后呢,下面咱把这个就是操作的key做个拼接,为了咱后面更加方便,那我来拼接一下啊,比如第一个是咱这个库存的这个key,那库存K呢,比如这里边我们给它起个名字啊,咱就叫这个,比如叫这个KCCT就是库存嘛,库存。它的这个T。然后库存K,我给它起一个名字,这个名字其实可以随便起啊,我就按照我课件中的名字起一下了啊,比如叫这个SK product ID冒号,这个叫QT啊,咱们就叫这个名字,然后写一下啊,这个叫SK冒号,加上咱这个product ID,然后叫这个QT啊,这代表我们那个库存的这个T。
11:18
然后除了库存P之外,这里边我们再起上一个用户的key,我们就叫user key,然后在里边也是给它个名字,我们叫SK冒号,加上product ID,然后加上里面这个就叫user。这个啊是我们拼接出来的两个K,为了咱们后面操作方便,因为你看这里边啊,咱都加上我们这个ID,就能区分你不同商品这个秒杀过程,如果你别的商品,那ID应该是不一样的,所以这个第三步完成了,然后完成之后下面我们进入到第四步,第四步做什么呢?就判断一下这库存是否等于空,如果等于空的话,表示秒杀没有开始,如果不等于空,咱再往下进行秒杀,那咱来判断一下啊。
12:06
怎么判断说一下,因为这个库存呢,大家想一下,最终咱是不是要存到ready中了,所以我现在就通过ready中来取一下这库存,咱们写个盖头,然后加上库存的这个K。最终返回一个字符串,比如叫这个KC就是库存,那这个咱们给他判断一下啊,如果说我这个库存这个值就是KC,它等于钠,那表示呢,目前这个秒杀还没有开始,没有开始的话,咱们给他做个提示,比如写一下就这个秒杀还。没有开始请等待啊,给他来一个提示,然后提示之后这里边我们把JD给它关闭啊,包括最后再re吞一个false,就让它进行等待,所以这是咱的第四步,判断秒杀是否开始,就判断库存是不是等于的,等于的那就表示没有开始啊,就是你等一会儿一会儿再进行,而这个做到之后,下面第六步,第六步呢,就判断一下你的用户是否就是重复秒杀了。
13:15
那这个怎么做呢?大家注意啊,咱们看一下我这张图上,因为我这个库存嘛,就是你的个数,咱可以加一啊,包括减一等等,但你注意我这个就是用户这个清单部分,大家想一下啊,我这里写的库存嘛,用缀,然后你看我清单用什么,是用S。各位说为什么用赛?赛的什么特点?是不是不能重复,因为我这里边ID值你不能重复添加,一个用户只能秒杀一次,不能秒杀多次,所以咱们用了一个再次集合,那咱怎么判断它是否是秒杀多次呢?咱们从SS集合中取到这个值,如果说这个值我们能取到,表示是不是已经秒杀过了,不能再秒杀,如果取不到,咱们再往下进行是不是可以了,就是从S中来取这个数据就可以做到。
14:08
那我来写一下啊,咱们用JD各位应该记得啊,Set中怎么取数据。肯定不是get啊,Get取字符串,注意有这么一个方法叫sis member,然后里边加上我们这个值,这个值呢,我们首先加这个K,就是这个user key,然后再加上一个ID啊,因为咱用它都有区别,后面咱们加也加了这个就是key,包括它这个ID,因为它是一个size接口。然后这个判断就这里边我们肯定有它的相应的这个值啊,那我们来看一下啊,就是这个判断的话,它返回的是一个布尔类型,就这个值在我这里边是否存在啊,用这个ss member判断它是否存在返回是一个布尔类型,那我直接咱就给它加上一个if判断一下啊。
15:02
If就是如果说这个K加上这个用户ID,在我这个就是秒杀成功的清单中已经存在,那表示用户已经秒杀过了,这个时候呢,咱们给他做一个提示写下啊,就写这么写,说你已经秒杀成功了,你不能重复秒杀。来一个提示,然后提示之后咱通过JDS把它做一个关闭,最终我们在re吞一个false,因为你已经秒杀过了,所以这是里边的第五步操作,把它就写出来了,然后写完之后我们再看第六步,第六步做什么呢?就判断库存呢是否大于零,因为你只有大于零才能操作,如果你这库存比如说小于一,或者说小于等于零,那你这里边是不是就不能在秒杀了,所以第六步我们来做这个判断。
16:00
那大来写一下啊判断大家看啊,我上面的这一行代什码得到这个KC是不是就库存呀,所以大据KC判断一下啊,那里边比如说我把这KC呢,先做个转换啊。In t.pass in这个KC,然后它变成一个int类型啊,这里边我们根据它做一个判断。如果说你这个库存,它这个值就是小于一,或者说小于等于零,那表示目前就没有商品了。咱们给他带个提示,我写一下啊,就说这个秒杀已经。结束了就是没有商品,然后进入之后,咱通过JDS把它关闭,最终再吞一个for。所以这是我们的第六步,判断商品它里边的值是否大于零,不大于零咱就表示它结束了,这是我们的第六步,然后还有最后一步,那就是秒杀的过程了,秒杀过程怎么做?第一个库存是不是要减一,各位应该记得啊,咱们加用英可瑞,减是不是用D可瑞,然后加上你这个库存的K,根据它把你的值减一,然后另外咱要把这个秒杀成功的用户加入到这个秒杀列表中去,因为它是一个set集合网,所以咱用这个写下啊,S sad。
17:30
然后加上里边的值,第一个值就是这个user key,然后第二个值咱就加一个用快递啊,这样的话把它就加进去了,所以这是我们的第七步秒杀过程,库存减一,把你秒杀成功的用户加入到这个添加到成功的列表签中去,然后最终我们做个输出,我写一下,比如这个用户啊,他就这个秒杀成功了。做这么一个提示,然后最终咱们把这个JD别忘记给它做一个。
18:06
关闭啊,最终re存,所以这就是我们快速完成一个简单模拟秒杀过程代码,咱把它就完成了,这一过程我带着各位我们再看一遍啊。首先第一步判断的值是不是等于空,等于空就行处,然后第二个连ready词,第三步拼接key,包括咱的库存的,包括用户的,然后第四步判断库存是不等于呢?如果等于呢,表示没有开始咱需要等待。第五步判断是否重复秒杀,如果你用户已经秒杀过了,那不能再秒杀,第二次通过S集合中。判断值有没有,然后第六步呢,判断商品里边的库存数量是否大于零,大于零才能秒杀,如果它小于等于零,或者说小于一,那就不能秒杀了。最后一步那就是秒杀过程,我们的库存要减一,秒杀成功,把用户信息或者说用户ID放到你的成功的清单中去。
19:09
然后最终关闭存处,所以这时我们写的秒杀的这么一个简单例子,咱们把它就最终完成了啊,所以各位按照过程能把这个代码快速写出来。然后洗完之后呢,咱们下面把它来做个测试,我们看一下这个效果最终是怎么样的啊,咱们来试一下啊,我们现在因为是一个普通的一个外部工程,所以我这里边通过这个to把它咱就给它启动一下,我们来看一下最终这个结果是怎么样的。现在我把它启动。然后咱们通过浏览器打开测试一下里边的这个效果。等到先启动啊。好,现在已经启动了,然后启动之后就这个页面啊,说这个IPHONE13我们一元进行秒杀,然后咱们点这个叫秒杀,点我它可以进行我们这个操作啊,但是目前呢,我这个ready中应该没有加数据,你点的话,这一提我们抢光了嘛,啊,也就是说里边你看页面中啊,就这句话。
20:16
因为咱目前反值肯定是false,我们目前没有数据,所以大家直接提出这个,所以咱为了效果明显,这里边呢,我就在这个read中给它加入这么些数据,为了咱能够看到它的效果,而RA中呢,我们加数据,咱就把这个库存给它加一下,比如给它加成十个,或者加成别的纸。啊,那咱们来加一下啊。我先连一下这个red,然后为了明显,把里边的内容给它,先清空一下flash DB,咱们写一个site,加上你那个库存的key,我们叫SK冒号,根据它这个规则啊,冒号加上你的这个上面ID0101,再加上一个叫QT,应该是这么一个规则,然后加上之后我们设它的值也是值是十。
21:07
咱们回车,然后咱们看一下,在这个就是SK冒号0101QT这个T里边有咱们的就是十个商品啊,这个咱们就加进去了,然后加进去之后,下面咱们把这效果我们再试一下,看一下目前是怎么样的。比如现在把它刷新,咱就看一下控制台的输出啊,比如现在我点第一次。你看是不是秒杀成功了,秒杀成功之后,咱们到这个中来看一下啊,K信号大家看啊,是不是有两个,一个是user,一个是QT,我们先看一下这个QT。把这个先看一下,因为QT呢,你秒杀之后,它的库存是不是要减一啊,咱看它有没有减一。大家看是不是九个了,然后咱们再看里面这个就是。用户,因为现在我已经秒杀成功了,应该是有一个用户这里边啊用户。
22:05
就是里边的这个值,我用它来看一下啊这个。呃,把它复制一下啊。这个用户呢,他应该是一个set集合,并不是我们的普通字符串,所以你用get应该是取不到的啊,所以咱们给他换另外一个命令,把这值给它看一下哈,它里面的值是什么,我们来看一下啊,我们来使用这个命令应该叫S,是这个member。然后加上我们里边这个K,用这个我们来查看,应该是咱之前特别说过的啊,这么一个命令。那我们加上它的这个K啊members啊,加上它里边这个K应该是这个user,咱们回车大家看里边是不是有一个5421,因为是咱们随机生成这么一个值啊,这样的话,这份数据都有了,比如说我们现在再来点。秒杀秒杀,现在我是不是点了很多次,然后到里边我们可以再查看一下啊,先看到里面这个user目前是不是加了这么多用户,然后再看里面这个就是库存。
23:11
目前库存是不剩五个,因为咱有十个嘛,那我继续给他,比如说秒杀完成啊,咱再秒杀我再点。每次在里边有这输出,因为你目前已经秒杀成功了,当你到十个这里边告诉你已经抢光了,然后秒杀是不是就结束了啊,所以这样的话呢,我们现在就模拟出一个简单过程,包括最后结束,再来看下里面的数据库存是零,然后里边这个。User是不是有十个用户啊,这些都加到了read中,所以这是关于一个简单案例的一个说明,咱通过一段简单代码就模拟出了一个就是最基本这么一个秒杀过程,所以各位啊,通过这个过程把这能给做到。但是这个过程中呢,大家注意啊,我目前操作是不是只是我自己在操作,就是我一个人操作,所以一个人操作,你发现这里边是不是效果是没有错的,是正常的,但是如果说咱这个秒杀嘛,大家都知道秒杀不同一个人是不是有很多人同时进行,所以里边会产生一个什么,就是一个并发的问题,但因为我一个人啊,我没法模拟出并发,而这里边如果你在并发场景中,在那代码是有问题的,所以我一会儿咱们通过一个工具给大家模拟出一种并发场景,然后演出里面问题。
24:32
目前的过程中,大家先知道咱们这个最基本的案例,包括代码一个并且过程一会儿咱通过工具给各位演示出并发产生的一系列问题。
我来说两句