00:00
各位同学大家好,终于来到了我们最后一章中章的总结,那么八整门课程过完了一遍。最终需要给大家做一个陈述性的总结,那么希望大家能够简单的听两句,首先感谢各位股粉,各位同学,各位B站的网友,能够跟着杨哥从零基础小白篇一直看到了我们的大厂高阶篇,谢谢。那接下来我们来看一下我们的总结将要说一些什么呢?对不起,本门课程没有总结,我骗你的。最终我会以一个最重要的能够帮助你写进简历有一点亮点和谈资的一个案例作为我们的收官之作,主要是防止各位收藏不学,完结散花。那么这样呢?大家都清楚,上硅谷任何一门视频录制的老师都是极其辛苦的。哎,可能没人看,但是都喜欢跑到最后一集完结,散花希望你不要再留这样的无聊的言论了,杨哥不求你。
01:03
对上硅谷任何多少,只希望每一位同学,每一位骨粉能够真真正正的通过上硅谷学到一点东西,认真搞钱,谢谢大家,所以对不起。如果你重视自己的学习,如果你热爱技术,如果你想长本事,我相信我这门72023版从小白篇到高阶篇,如果你认真看,没有一到两个月,你是搞不定里面的笔记、作业和案例的。所以呢,不要自己骗自己,希望大家能够通过上硅谷更上一层楼,钞票更厚一点,谢谢。那么接下来我们来吧,还是在学习的路上,腾讯原题你都用过我们微信吧,那么如果想请你做一个。迷你版的微信抢红包,人家问的说的也挺好啊,你比如说因为微信的话是一级用户在用,普通公司的,你可以做一个参考腾讯对应的业务,对吧?我们做一个我们本公司自己的迷你版的微信抢红包,那么请问你日常用过这个功能有哪些思路?所以呢,各位签学完以后马上就能用,学完以后就请写在简历上,你用ready做过些什么?
02:23
来吧,弟兄们,2023年了,请认真搞钱,认真学习,那么跟着杨哥一路狂飙,请告诉老莫,你暂不吃鱼,但是请跟着杨哥,你想学习,毕竟没有那么多时间等着你慢慢成长了。紧跟上硅谷的步伐,紧跟杨哥的脚步,一句话。风雨直打落难人,麻绳专挑系住窜抬不起头的日子我相信都不好过欧啦。那么弟兄们,下面ready最后一个案例作为总结,微信抢红包来吧,下面理论实操小总结三板斧,先业务分析,再设计架构案例,最后编码实现。那么弟兄们我们来先看一下啊,说人话,微信抢红包,那么发红包抢红包不用多说了,都用过,那么你思考。
03:21
它会有哪些重点需要你去完善,你有哪些功能你需要去考虑,首先就这么个图,要有红包吧,能发,要有红包吧,能抢,哎。关键你发完红包以后,还有红包详情的记录,有对应的张三所发出的红包要有一个list类似的东西,记录出每个人谁什么时候抢了一个红包,对吧?那么第二个有没有可能发出来,人品不好,24小时以后这个红包根本没人动过,或者是有部分被强调,那么该不该有红包的过期时间,且有资金回退的功能,那么最后请问一下,你发个红包要么?
04:12
等额100块钱发五个红包,每个20,要么金额就随包随随机,那么请问这个红包的金额的拆分要没有什么规矩,所以各位亲业务描述都清楚,抢红包,发红包,那么下面我们的需求分析。第一个各种节假日发抢红包不说了,100%是高频发的业务要求,你绝对不可以用买来做对吧,这把你们买这个打成什么样了,打成筛子了。第二个,一个总的大红包会有可能拆分成多个小红包,那么你的总金额,比如说100块钱分金额十块,20 30等等,那么总之一句话,要能够。在总金额范围以内分成等价的,那么这儿提前说好,我们只是验证和做通我们对应的功能,我们这儿图简单,我就不考虑小数这个问题,我们本次演示都以整数来进行金额的划分。第三个,每个人只能抢一次,你需要有记录,对吧?谁谁谁抢了这个红包,100块拆分成十个发出去,总计有十个,抢一个,少一个,那么总数要显示,比如说总的是十个,现在呢,已经抢了六个了,那么需要记录哪些人抢了红包,重复作弊的是不可以二次抢红包的都清楚。第四一个。
05:35
计时哦,完整抢完从发出到全部O耗时多少?甚至啊,如果红包过期24小时以后还有剩余的要回退到发红包那个人,那么红包过期了,或者群主人品差,没人抢红包没人动过,一分没动或者什么没有抢完,那么对应的要有回退,那么第六个红包过期了,剩余金额回退到红包的主账户下,那么由于是高频发,咱们不可以用MYQ来做,只能用red。那么请问我们学了那么多数据类型,你的这个红包你觉得应该用哪一种数据类型来进行记录?注意哦,简简单单一张图。
06:17
那么请问你们觉得是应该有一种数据类型?来记录,来处理,还是应该有多种数据类型来混合呢?我先暂停一下录屏,请同学们简单的做一下思考。好,那么来弟兄们,我们来看一下啊,目前我们碰上的痛点。第一个兄弟们,发红包没问题吧?那么请问高并发。多线程业务请思考发红包要不要加锁好,这是我们的第一个问题,第二步,什么东东是不是我们的抢红包对吧?第三一步,各位同学大家思考一下,我们要干嘛,是不是所谓的记录记红包,哎,张三什么时间点点过这个红包抢了多少钱对不对?然后的话防止作弊,他不能二次抢,哎,你已经抢过了,就没有你了,你不能二次作弊来最终发抢记录每一个。
07:25
客户每一位同学,每一位同事所点击抢过的红包,那么就是记红包,记录抢过的红包对吧?那么最终一假设我100块钱发五个红包出去没问题吧?那假设啊,一个红包是95块。另外那四个红包可能就平分剩下的那五块钱。几毛几毛,那么这个时候回答我,你是不是尽量要做到红包的总数?平均分配到各个拆分的子红包,听懂这意思吗?所以说我们这儿也就需要有一个拆红包算法,所以真真正正的你要完善并处理好一个抢红包这么一个功能,那么基于肯定的对吧,高并发实时的要快。
08:17
不要存入MYSQL,抢完就完了,那么所以发抢即拆四大功能点你该逐个逐个考虑吗?那么下面请问一发抢记拆,这是一种算法,这倒是好说,关键是前面这几个,请问你们觉得发红包用哪种数据类型?Ready里面的第二个诟并发实时,请问要不要加锁?需不需要发红包的时候look and look?好,同理,那么抢红包肯定也是高并发多线程的义务业务,就跟我们在Java SE宋文康老师给大家讲的多线程卖票一样,我发个红包,就像票数有50张,或者我就发了50块钱的一个红包抢,诶,这块有五个线程来抢,那么请问这个抢红包要不要加锁?
09:09
第二个如何保证高并发实时,你觉得在red里面用哪种数据类型?第三个,哎,我得记录下来,张三。他抢了一个什么什么样的红包,对吧,几点几分抢到,哎,最终好,我们这些诉求完了以后,同学们请看我们的架构设计一。难点,拆分算法如何?也就是我们红包它有一种拆分金额,对吧?给你100块分成十个或者五个不等的小红包,小额有可能有小概率有两个红包可能都是二块五毛八对吧?那么如何拆分随机金额,设定每个红包里面安装多少钱,最好是有点平均分配对吧?大家一打开哟,这哥们抢了96块钱,那么下面我们五个红包,剩下那四个人就抢了一块钱,慢慢的你就发这个红包,这个算法不合适,大家也就不想玩了,如何保证均值上这个红包或多或少能够让大家抢的都差不多对吧?100块钱除以五,平均20块,那么你应该是在零到20之间上下浮动,他抢了16,这哥们抢了18,这哥们抢了22,这哥们抢了多少多少,只要差距不大,大家玩的才有意思,那么请问红包算法用什么?第二个次数限制,每人只能抢一次?
10:33
那你怎么知道他抢过那100%,是不是任何一个抢过红包的人需要被记录到一张表,一个库,一个容器里面,下次他来抢就要去里面查,如果有你了,说对不起,你已经抢过了,不能再抢,否则说明这个人是干净的,可以抢,也就是说需要防止作弊,防止作弊,防止重复挣钱。第三,一个原子性,没抢走一个红包,就要减少一个,类似于减库存,那么这个时候就要命了,要不要加锁呢?宋永康老师给大家讲的加SC的多线程,那个卖票卖一张可是要加锁哟,这个就需要保证库存原子性,而且加不加不能加锁。弟兄们思考一下,我们抢红包的时候,你要是加锁,其中春晚的时候,春节的时候抢红包,第一个人抢的时候卡了。
11:20
那你告诉我这个时候后面是不是排队全部阻塞,那这个服务器是不是死的更快啊?所以要求你高并发,多线程,不加诉原子性通通需要你保证和掌握,请问咋整?那么最终弟兄们,你们认为应该用什么样的数据类型搞定上面的诉求是单独的set,哈希、list the set stream或者Peter map等等,还是一种数类型就够了,还是需要多种数据类型混合配合好我们弟兄们来吧,所以说我们这儿关键点来树立我们的诉求,发红包,抢红包。
12:00
抢不加锁且原子性,还能支持高频发,每人一次,且有抢红包的记录,OK,记红包记录对吧?记录每个人抢多少拆红包?那么来吧,算法,所有人抢到金额之和等于红包总金额,不能超过也不能少于每个人至少抢到一分钱吧,你不能,我是抢到红包了,我碰了一下那个红包里面是个空的,要保证所有人抢到金额的几率大概是相等的。所以最终我们的结论。就要得到一我们该用哪一种数据结构里面第二个抢红包在拆这块我们的这个算法。那么业内。他一般用什么样的红包算法,那么这个时候请听好,一般我们会强调有这么一个算法在红包里面,叫二倍均值法,哎,这个就是我们拆红包日常公司里面啊,因为我们不是腾讯,我们不可能说一个人就等于人家一个微信部门那种高频发一级流量系统,那这个是整个运维团队。
13:19
扩缩容弹性的,这哎这这太复杂了,我们就说假设啊,我们公司参考腾讯做个公司内部的,我们电商小系统,我们金融系小系统这样的一个内部版的啊。普通的百万级的。抢红包的这么一个促销活动,我们参考腾讯。那么来。主要金额一拆分100%要涉到,涉及到我们的拆分算法,前面说过要保证每个人的大概率拿到的钱差不多,所以业内常用的俗称二倍均值法,弟兄们跟着走第一个。剩余红包金额为M,剩余人数为number,有这么个公式。每次抢到的金额区间,随机的区间,比如说100块钱拆分成五个红包,那么大概金额是从零到剩余红包M除以N得到的值以后再乘个二来,同学们请看啊,这个公式呢,保证了每次随机金额的平均值是相等,我们说过了啊,比如说100块钱五个红包,平均每个红包20块钱,那么每个人抢的十多块钱差不多,你抢14,我抢16,这样大家看的差不多才喜庆嘛,对吧?这个呢,过多过少都不利于红包的扩展和推广,那么他不会因为抢红包的先后顺序而造成不公平,弟兄们请看演算十个人。
14:43
100第一次好,假设杨哥包了一个红包,100块钱,人数十个,发个红包妥了,那么下面一堆人过来抢,那么大家请看剩余的红包金额,第一次是不是没人抢,是100,那么下面人数是多少?十个,那么请呗。
15:03
第一次是不是100除以十对吧?那么十乘以二是不是20,所以第一个人的随机范围,那么这个人你不能说一口气把100个红包全都抢完了,你别让我吃什么呢?所以说呢,一算第一个抢红包的人,他从这100块里面能能能拿到的钱是零到20,平均差不多抢到十块,这样的假设第一个人随机到十块啊,我们随便说的,那么现在剩余金额就是100。减去第一个人抢走了十块,那么剩余是不是还剩90块钱?好,那么第二次注意剩余金额是多少?是不是90,剩余人数多少?注意第一次是十个人七抓满月,但是这个人已经抢了十块钱走了,那么现在是不是剩下只有九个人了?所以90除以九等于九。那么哦,抱歉,90除以九等于十,十乘二还是20,所以第二个人也这样,那么最少90减去十块还剩80,那么第三次也就大概率就这么多,平均可以抢到十块,那么这个时候以此类推,每一次随机范围的均值是相等的啊,我这儿说十块只是举个例啊,就反正啊,假设零到20,他拿了15。
16:16
那么好,第一个人抢了15,那么现在就是100减15,还剩85,那么85再去除剩下的九个取个整乘个二,然后等等,这样的话呢,保证差不多每个人都可以在这个均值里面获得,那么这个就叫我们拆分红包的,切记要求背下来,那么这个就是二倍均值法,也就是微信红包里面经常通用的一个算法,保证一定金额拆分成多少个红包,在这么多人数里面大家拿到的都差不多,好那么同学们,这个就是我们对应的全部业务,那么接下来弟兄们编码实现那么老规矩,我们搭建好我们对应的平台了,对吧,直接写就行了,首先一般是我们呢controltr了这service,那么现在杨哥呢,为了省事,我们呢就只写CTRL了,那么回到我们消灭相关的设计,那么同学们请思考倒着退拆红包。
17:16
搞定了,那么接下来我们这呢,100%是不是要写一个叫red package,也记我们的红包CTRL了,对吧?那么来吧,弟兄们,Red package control出了,OK,这个我相信大家呢,没有任何疑问,我的问题是发红包,咱们思考一下。用red什么结构?那么首先我们揭晓答案,每次我们这这个red是个TV建制队,对吧?那弟兄们我们就要思考了,什么样的金额,我们可以把它拆分成多个,且放在一个集合里面,那么现在是不是要变成什么概念,一个红包多个金额值,比如说现在杨哥搞一个总,总数是100块,那么五个红包,那么比如说20 20、20、30,十块行不行?那么现在就是100块钱五个红包,那么拆分成20 20、20、30 20块可以吧?啊,咱们经常为了讲课方便,不考虑小数的事,那么请告诉我在Java或者是red里面有什么样的数据?
18:39
结构支持一对多就一个K,它可以拆分成多个,那么弟兄们100%是不是在发红包的时候,最经典的是不是就是应该是我们的list这种数据结构啊,那啥意思呢?那么l push,比如说你这个K啊,这red package,好,那么下面这个,比如说是个UID,这个呢是the number。
19:11
听懂什么概念,就是说比如说每次发个红包,我们在里面这个key的前缀是不是应该固定,那么这个value呢,可以是用户编号,也可以是某次红包的流水号,就像是一个什么order订单流水号一样,这么说能跟上,那比如说我这就是red package。UUID红包的流水ID对吧?那么这就是是不是就l push加到这个key里面对不对,然后在这个里面是不是二十二十二十三十十,那么弟兄们能理解了吧?好,我们这为了取简单一点啊,那么假设我们这儿就是red package01可以吧,不管你是用户ID还是各种流水号,没问题吧,那么来弟兄们,接下来我发了这么一个红包。
20:04
好了啪,丢在微信的群里面,相当于微信群里面你看到这个红包就是这么一个T红包,前缀加流水号和用户ID,谁发的对吧?那么来你塞进去100块钱,拆分成五个,那么弟兄们怎么取呢?那么下面这个就是抢红包,那么抢红包以后就是如何保证高,也就是说我们的难度啊,保证第一个高并发抢红包在群里面肯定是多线程对吧?然后还要保证什么不加锁,然后且保证原子性。那么弟兄们请思考一下,你告诉我咋做?这个时候你100%需要放进red,因为前面我们说过那么多,人家天生骄傲,本身就是每个命令就是单线程,然后原子性天生保证啥情况好,我的意思就是。
21:10
我现在来点一下这个红包,Red package,零一,这个红包点一下我随机分配,我不管抢到多少金额,是不是要从list里面出去一个,那么这个时候同学们还记不记得我们学过一个l airport,这么说能跟上,那么red package,然后零一,请看弟兄们点一下出去一个怎么样,再点一下出去一个,那么好来。L下面就是我们的red package01这个红包,请看这个意思,是不是一开始我塞了一个红包有五个金额,现在点一下抽取一个,点一下抽取一个,那么这个时候我们就会明白什么情况,是不这个五个红包里面已经被抢掉了一个十块的,已经被抢到了一个30的,那么再来再抽取一个,那么弟兄们是不是又被抢掉了一个20的?哎,所以说呢,按照我们的二倍均值算法,假如说100块钱拆分成五个红包,每个红包的金额大致就这么多,那么以后抢红包是不是在我们的例子里面,咱们直接用这个L。
22:25
出list即可,这么说能跟上,那么请问每次出的时候它是非常快的,那差不多是什么微秒级别,马上。就没了,所以说不用加锁也能保证原子性单独执行这个命令的时候,听懂好了,那么接下来我们就会明白,我们。对应的发红包、抢红包都放在我们的一种数据结构,这种数据结构是不是就是我们的red里面的list这个结构弟兄们没问题吧?好,那下面这个记红包呢?你别忘了我们的诉求,大家看一眼,哎,不是这个。
23:09
红包详情谁谁谁抢了对吧?三个红包十秒钟被抢光,怎么怎么怎么之类的,OK好了,我们弟兄们一句话,我记红包的作用,一方面是什么盘点加汇总,另外一方面是不是防止作弊,同一个用户不可抢夺两次红包。对吧?所以我得记录一下,那么这个时候同学们请告诉我,你怎么记录red pack01这个红包被抢过,被谁抢过,谁抢了个多少的等等等等,那么请问用什么结构,请大家思考一下,别忘了弟兄们,咱们这个时候我们所要做的是不是最经典的二?
24:05
大家都会想到是不是有我们最重要一种结构叫h set哈希啊,好,我记录下来,比如说这个就是对应的某一个红包,他field的被张三抢了多少,那么下面我们就要去另外的这个记录的这个T里面录下是谁抢了多少的红包,当然这个是红包的那个流水号,对吧,我们这呢,稍微改一下,那比如说这个叫OK,意思就是另外一个另外一个K,这个K就要记录下来,我总的这个K里面谁抢了一个多少的红包,请给我写进来啊,比如说第一次是十块,我们这啊,假设这也是个用户IDCIID卡的ID,他抢了个十块的,哎。
25:03
另外一个,另外一个ID cid2代表第一个是张三,第二个是李四号抢了个30的CID3号,那么他抢了个20的,那说明这个时候我们打开就会获得五个红包,里面已经有三个被抢掉了,那么我们这就可以记录下面这个是个哈希,它可以获得全部的对应的值吧,就说现在有几个,那么假设啊,我们这个list总数晓得的,哎,是五个,那么现在我已经在这个记录抢到红包的K里面已经记了三个,那是不是总的是五个。第一次出试就记录好,它不会变对吧,然后现在抢一个就往这个customer里面就加一个,那么这个时候是不是会每个抢红包的子红包就给你记录好,哎,所以在这我们就会得到结论,记录红包我们用的是哈希这个结构,OK,分析完了,我们弟兄们从头到尾整个抢红包就要保证高并发,多线程不加索,且原子性,主要是list来发和氢。
26:15
哈希来记录最终二倍均值算法,来进行拆红包的算法,弟兄们架构分析业务全部梳理完成,接下来第二步咱们呢,是不是就来进行我们对应的Co定编代码来吧,咱们呢,简单的编一下代码,选中我们原来这个RED7STUDY这个工程,切记其他的不变啊,那些连ready都通了,那么这引入一个瓜娃,哎,到后面的这么一个小工具包啊等等这些呢,J呢,我们都说过了,好了,不再废话,Control错了。那么直接搁到这,建一个类red package controltrler没问题吧?那么老规矩了,弟兄们是不是就是我们的rest ctrler啊,正常情况下啊,应该是ctrler去调我们的service,我这图省事,因为反正给大家跑通就OK了。主要是。
27:13
相关的对应的代码service我就拖过了,就不写了,好,那么接下来直接过来我们对应的string,那么弟兄们是不是就是我们的red package下划线这么一个T,那这个key,弟兄们我们干一些什么事呢?那么来是不是就是我们ready那个key,那么red。Package,好,这个就是K的前缀位好了,那么第二个还是这个,也就这个key,就是我们设计上的这个发抢红包,往这个例子里面发,往这个例子里面pop弹出去,那么下面是不是要有个G红包,对吧?也就是我们对应的一个哈希的这么一个K,然后这个呢。
28:05
对应的也就是我们的哈。来哪一个抢到了我们对应的这个key,好,Red package,然后呢,谁抢了?Consumer吧或者customer都可以吧,Consumer吧,消费吧,OK,那么在这改吧,因为这个customer一般是用在这个顾客下订单,我们就消费吧consumer OK,好,那么这个呢,相当于是那个哈key它来记录好了,那么接下来呢,我们老规矩,Private,我们呢,是不是要放到我们的呃,Temp里面100%是不是用到我们的red temp,那么注入进去,Out OK,这个是之前。
29:00
最基本的定义和变量好了,那么。接下来呢,那么请同学们跟着来,那么第一波方法是不是就是我们的public,干嘛我们定义下来的是不是就开始呢?发红包。Red package了。那么来吧,Request mapping,那么搁到这儿了以后呢,我们过来这well了send,然后这个呢,就是我们发送一个红包对吧,那这个红包呢,In total money多少钱,总数100块钱,你发拆拆几个过去啊,那么这个时候呢,就是我们红包个数。Number OK,弟兄们,没问题吧,那么搁到这儿了,以后呢,我们来看啊,第一波就是开红包,将总金额。
30:04
Total money拆分为red package number,这规范一点吧,Package number。Go。紫红包弟兄们,这一波没问题吧,所以呢,因为啊,到最后我们差一个出去一个,是不是要记一个,所以呢,在这块in是这么一个数组,我们就记录着你拆出来的红包。Red。Package,那么这块要等于一个什么呢?那么这个听好就是我们的拆分红包算法通过后获得的多个子红包,对吧?List或者是子红包数组吧,其实数组和历史一一个意思啊,就这样啊,就是现在比如说杨哥掏100块钱塞在微信里面。
31:16
写个数字几个呀,五个为叠发,那么这个时候将会触发这个拆红包这个算法,然后就把我的总金额和要求拆分的个数按照二倍均值算法拆出来,那么假如说就刚才我们所说的20 20 20,二十三十,这样是不是有个数组就塞过来,所以呢,搞到这我们呢,先不写了,我干嘛呢,来我们这啊。Return,那么这个时候先不报错啊,一点点完善,我要干什么呀?弟兄们,我这呢就来事了,我们这儿是不是要写一个我们的这个就是我们的拆红包的算法,那么也就是我们前面所说过的二倍均值算法来了,那么这个呢,不对外暴露它返回出去的呢,也就是这么一个,OK,相当于说把这两个参数丢给这么一个方法就可获得一个。
32:24
红包多个子红包对吧,比如说100块钱拆五个好了,那么在这块呢,也就是我们的拆红包red package,然后呢,算法好了,那么这个呢,就是我们拆红包的这一块,直接就拷贝过来了,偷懒了啊好了,我们由他来拆分,那保证每个人呢,拆的呢不是特别特别的细好吧。基本上啊,能保证你呢,能够每个人都可以获得差不多的红包来了,你点点来吧,那么这个时候加这么一个数组,那么这个时候就是我们的re。
33:14
Package红包的个数好了等于六,那么这一后就是我们的。这个OK,然后呢,接下来这个就是已经被抢过的,或者是被抢过的红包金额钱数,红包金额,那么这儿就是use money。OK,一开始有一个都没抢嘛,那么来了,这个就是我们的二倍均值算法,它的核心,那么首先。我是不是一个数组对吧,我五个红包嘛,现在red package。按照你上面传过来的,你自己指定100块钱拆分成五个,那么这我是不是要五个子红包便利,每个红包塞进去大概一个金额多少钱,就是20 20 30,十块这样的,那么怎么玩呢?如果这个I等等,那么我red package number减一啥意思呢?就是说因为数组下标是从零开始对吧?但是我们红包一般说第一个红包,第二个红包到第四个红包。
34:29
第五个红包是最后一个,意思就是说假设这个零开始,那么固定的这是几个五,那么假设它到四,五减一是不是四,那么也就说明是什么最后一个红包,那么最后一个红包就是假设我们要拆五个红包,前四个按照算法。金额是多少就是多少,那么第五个是不是总数里面,比如说现在。100块钱,五个红包,前四个已经用了80了,那么最后一个红包就不用什么算法来搞了,直接就把剩余的钱给他就完了,所以呢,我们最后的这个是数组I,就等于我们呢,总的money减掉我们已经被抢掉的钱,这么说能跟上,比如总的我们是100块钱,那么现在假如说20 20 20 30,前四个通过算法每一个算出来多少塞进去,那么第五个红包100%的数是总数减去前面已经被抢掉的,那么剩已经被分出去的,已经被抢掉的,已经被分出去的,那么这时候它就是最后一个,OK,以及最后一个就不用再计算了,那么接下来如果不是最后一个,也就相当于说五个里面是前四个,每个红包里面应该塞多少进去。
35:46
那么这个时候我们就要用用二倍均这个算法,那么也就是我们刚才所讲的二倍均值算法,对吧。好,那么它的公式是什么样呢?就是每次拆分。
36:05
后的,每次拆分后塞进子红包的金额,那这个公式啊,它基本上呢,是这么干的。金额呢,就等于我们的随机区间来,我拆个红包不能说是等于零吧,没有意思啊,对吧,三零进一个红包不可以,那么就大于零,小于我们在这儿的刚才前面所写的公式,剩余红包金额M除我们未被抢还没有被抢的剩余红包个数N,然后呢,乘个二二倍均值算法嘛,哎,所以说呢,在这儿,那所以说在这块意思就是说我们上面要发红包嘛,100块钱分五个,我们这儿这个那意思就是说。
37:15
要获得这么一个红包列表,对吧?假设五个子红包每个金额是多少,我来就要来调这个Li red package这么一个算法,那么这个算法呢,给了你假设五个对吧,一个小数组过了这一处理的话呢,那么接下来。在这块,那每次拆分后塞进子红包,我们第一次塞个十块,第二次塞个20,是这么一个意思,好,那么int来吧,Avg money,那么也就是我们的每次塞进去的这个金额啊,干脆这样,OK,同学们写在一行,大家好看一点,那么就来喽,我们在这一块呢,大于零,那个倒是好说,那么基本上搞到这也就是等于我们的total money,然后呢,减掉我们的。
38:09
Use money对吧?然后除以我们的什么东东呢?Red package number减去I,获得了以后再乘个二,好同学们请看一下,我们来可以最简单的啊,第一次啊,多少钱,100,这是总金额不会变的,那么减去money,这个就是已经被抢掉,或者说是已经被抢的金额,就是或者叫已经被拆分塞进子红包的金额,那么第一次没有嘛,对吧?所以说100减去零这个值是不是现在就是100,那么就是剩余红包的金额,好,现在还没拆呢,第一次100,那么下面几个五个红包I。
39:00
从是一个数组,五减去零是不是等于五没问题吧,那么这一圈下来相当于就是100除以五等于二十二十乘以二,那么下面相当于说这个平均塞进去个钱,就是什么40块钱,OK,二倍均值嘛,就是我每次拆20块钱乘个二就是40块钱,那么好,接下来我们这个数组里面red package numbers第二个,比如说第零个红包,也就是我们的第一个,那么就等于我们的一加上你random随机啊,因为我们有这有个区间零到。这个数字那么要比它小,所以说这个你用random应该是大于零,小于某个数字嘛,所以说就是我们的平均这个钱减个一,那么这我里面减了一个一,我们在这呢,干嘛呢,直接呢过来呢,给你呢加个一,就是这个意思,OK,好,那么同学们请看re,这平均值啊,假如这块40对不对,那么我们现在要需要弄的是不是要大于和小于嘛,那么尽量再靠谱一点,再往前攒一位减掉一个,但是我减了一个,我补一个意思,就是说我这个值是40,但是我现在不能等于40 OK,那么好,Next in,这个时候是不是零到这个值啊。
40:20
尽量的不让它靠近这个40,但是我里面我减一个OK,我外面再加一个OK,好,那么搁到这儿了以后啊,那么就是我们的use money塞进去的这个金额,第一个红包,那么就等于我们的use money加上我们的这么一个东西,OK,最终各位亲,我循环分派完毕以后,我们要把我们这个数组再给你返回,听懂这个意思吗?那么这个就是我们拆红包的算法,二倍均值法,那么把一个总金额按照我们的设定的个数拆成五个,平均每个是多少?那么我们呢,可以呢,最后呢,来看一遍。
41:01
我们设定完了以后啊,这个一是说白了是剩余的最后一个了,就不用二倍均值算法,就是你剩多少塞进去就完了,那么这个呢,可以看得出,就我们刚才所说过的,总的减了以后,好第一次,那么假设第零个,那么一加上我们拆出来这个二倍均值算法啊,那么反正就是40以内的可能是个17,那么加一个好我们过来,这第一次是零,加到这搞定好第二轮我们过来了,那么I现在呢,第二轮负循环,这个I是一五减一,告诉我等于多少,是不是四等不等于不等于,那么再过来,那么现在啊,假设第一次用掉了20块钱,那么现在总的是不是就是100 100里面已经拆出来了,第一个红包拿掉拿走了,拆出去了,20塞进去了,那么现在是不是已经拆出去的钱,就是用掉的钱是20啊,那么100减去20,告诉我这个是不是等于80啊,没问题吧,那么下面是不是五减一是四啊,80除以四啊,是不是还是二。
42:02
值20乘以二是不是还是40啊,这波能跟上吧,那么也就是说每次我们保证就是在40的范围,就是每次这个值就是22倍均值嘛,乘个二,然后在这个随机里面来取,那么保证每次都是在40范围以内,然后呢,获得我们这么一个红包,最终前四次是用二倍均值算法,那么总共是五个最后一次。前四个已经用算法分配完了,最后一个不用算法,因为剩多少就是给最后第五个红包就完活,OK,好,那么同学们这个呢,就是我们的是吗?拆分红包的这个算法,好,那么拆分红炮这个算法拿过来返回到我们上面,那么拆分红包算法通过获得多个子红包的数组,那么来吧,弟兄们,隔到这儿我们直接调用这个红包,那么现在多少钱啊,总共假设100块钱,拆分成几个啊,拆分成五个,那不废话,你现在呢,就给我呢,拆出来了这么五个红包,对吧?好了,那么注意,那么第二步啊,我们这个呢,就是拆完红包以后是不是准备发红包并保存进list结构里面。
43:18
OK,好,那么同学们开工啊,一步步来,那么现在string,我这个T是不是就等于我们的这个现在这个红包固定的red package就这么个前缀,然后完了以后呢,它呢叫加上加上个什么东东呢?是不是我们的一个流水号或者用户编号随便啊,那么我这呢,就是哎,简单的搞一个这么一个ID作为一个红包的流水号,弟兄们这一波没问题吧,好,那么搁到这了,以后各位亲继续,这是我们保存进list里面,那么怎么保存呢?
44:00
来我们的干那活呢,就是right temp,然后呢,Op for,我们找到我们的list,然后left l push过来这个key,然后几个我们要丢个数组进去,那么是不是拆分,用这个拆分算法弄出来的这个数组一丢进来,相当于说就是把这五个值放到了我们这个T里面,没问题吧,你们别忘了,我们一般说红包是不是。24小时以后没有用完,它会回退过期啊,对吧,所以说在这儿我们放到历史结构里面,且设置过期时间,好,那么同学们right temp点二干嘛呢?Exp,那么这个是哪个K,你们是不是不是就是我们对应的这个K,然后呢,弟兄们多久啊,一般红包是不是二四小时,二四小时是不是就是一天这么说能跟上这波弟兄们。
45:04
OK吧,好,那么完火以后我们呢,直接呢叫return我们这个key啊,发红包结束,那么第三步,那么就是发红包,OK,返回前台显示,那么比如说我们这就应该有个K,这个key里面就要跟着我们这五个红包,每个金额大概是多少,好了,那么搁到这,我们来做一下对应的这个算法和梳理啊,那么这个key我们就要把返回我们这个红包,我们这个红包呢,In there as the list。搁这,哎呀。第S,这是一个我们前面说过的啊,谷歌瓜A里面的个工具类,很好很好用,那么我要干一件什么事呢?弟兄们,那么艾瑞哎,我的妈呀,用我们的流式计算艾瑞斯啊,死就一摸。
46:06
然后呢,在这块呢,我们呢,就会有一个我们对应的。数组对吧,然后这个数组呢,map.to我们这个T呢,是不是in teacher全部干成数字数字。转换过去inte,然后完了以后的话,我们直接to瑞,然后呢将其搞定,这么说能跟上好,那么相当于说这这个key啊,就会告诉我,比如说这个叫red package冒号,然后呢,这个是一个ID流水号,没问题吧,这个就UID流水号就是本次红包的,不管你是UUID还是用户ID都可以,然后呢,直接把我这个返回成一个int数组,返回给前台,OK,好,那么这个呢,就是我们的发红包结束,发红包搞定,接下来是不是弟兄们我们要进行我们对应的抢红包了,好了。
47:09
那么抢红包呢,怎么做呢,跟这个呢也差不多,直接过来吧,这个呢,就是L抢了一个是发有发红包的,是不是就要有我们LB抢红包的,那么抢红包来吧,我们就要记录下来,我们这个是string,那么这个红包大家可以看得出。Red package key哪个红包,然后完了以后呢,User ID谁抢的对吧?那么来吧,弟兄们来看我写完我们在竹涵的翻译给大家。首先就先。验证啊。我们的某个用户是否抢过红包,不可以多抢,OK,那么我一点,我一抢,我要先干什么呢?诶,那么我们是red temp.op for什么东东,哈希,我们这儿是不是说过我这是发红包,你这是抢红包,发存进这个list里面抢。
48:26
L从这个例子里面出战,但是你出来的东西又要同时干嘛记录进我这个哈希里面,告诉我谁抢了这个一个子红包,那么好,那么这儿呢,我们对应的OPS呢,谁呀,就是我们点get,相当于说h get哪个是不是就是我们对应的这个K啊这块的话呢,我们呢,直接呢应该呢是全部改成大写啊刚才呢手握好,那么这个key的话呢。
49:00
丢进来,然后加上我们的红包的这个key对吧,就说相当于说这个是UID,那么这个就是我们的consumer这个key,好来这个key是固定的,这个是只是key的前缀啊,这个是我们抢了哪一个红包,对应的红包的这个编号,然后一拼起来这个key里面来看看有没有这个UID,有没有这个用户,对吧?来弟兄们。O了,那么这一块呢,是返回来给我们一个这个叫red package,不要用O了啊,那么我们直接呢,就说先去查查,先去哈哈里面是否抢过红包,不可以多抢,那么我们要有一个consumer这么一个哈希的这么一个key,每一个field就记着哪个用户抢了那个红包,对吧?去看看对应的这个key,这个编码,那么相当于说这个是前缀,OK,那么这个前缀完了以后,弟兄们,我们这个前缀完了以后,再加上UIDOK,好了,来看看有没有,如果查出来了弟兄们啥情况来第二步,没有抢过就看下,假设他是个难啊,没有抢过,那们可以去抢红包,否则呢,不好意思啊。
50:33
我们就如果是有说明什么,我就返回负二,表示该用户抢购红包了,弟兄们这一波能跟上吧,那么假如说啊,那。等等,哎。我们这个red package这个对象是个,那是个,那说明是不是没有抢过,这么说能跟上好,那没有抢过我干什么呢?2.1啊,这一步一步步给他写清楚,那么就是从。
51:08
大红包,也就是我们刚才的这个list里面。出对一个作为该客户抢的红包,OK,那么也就是我们平时所说的A怎么着抢到了一个红包,好吧,那么来吧,那么接下来就是,那么就是我们的red complete.o for list点干嘛?这个是不是叫l pop,那么就是left pop,弟兄们,这波没问题吧,那么哪一个呢?那么是不是就是我们的?Red package key,那么再加上你抢了哪个红包,那么是不是我们的red package key这一波弟兄们,OK吧,好,那么这一块就是你抢夺的红包,那么就是一个紫红包,Part red package,好,那么。
52:18
抢完以后,如果我们这个子红包不等于那啊这其实呢,就是应该都不回啊,都这样呢,做一个标准的一个判断,那么不等于那说明什么,我们2.2就是。抢到红包后需要记录进去,哈希结构表示谁抢到了多少钱的一个,或者说多少钱的某个子红包。哎,就是我们刚才所说的发。
53:03
前GOK,那么来了这块要怎么做呢?那么right ten.ops four我们说过了,记录是不是用哈希,哈希是不是put哪一个呀,那么这个时候是不是就是我们前面这个consumer,哪个顾客啊消费掉了,抢到了,然后呢,加上我们的红包的这个key,这么说能跟上,然后呢,哈希的话是不是就是相当于说这个put就是那个我们的h set,这个K,这个是不是就是我们那个field,然后第三个参数是不是就是我们那个value,我们来吧,这个field谁是不是就是我们的user idea,哪一个人他抢了多少钱的一个红包,那么这个子红包是叫park red package,弟兄们这么说能跟上,OK,好,那么这个呢,就抢完了可以来验证一下啊。另外下面打出来就是说,比如说后台啊,用户啊。
54:04
谁,那么也就是我们的user,哎,User ID抢到了多少钱的红包,什么搁到这完了以后的话呢,我们就是PART1个子红包,Part red package啊指数后台打印出来,那么OK,那么接下来呢,Todo那么干嘛呢?就是后续的一些啊,就什么回退的一些更复杂的工作啊,后续异步进MYSQ或者MQ进一步做,比如说什么统计处理啊,就是说你抢完红包以后,你是不是有这种功能,就是每一年是吧。你发出去多少,发出去这个发出多少红红包,抢到了多少红包,那么类似于那种年度总结,那么这个时候呢,就应该是。
55:04
后续的话去做一些这样的东东,好吧,那么大家呢,我们的这呢,主要是为了也示抢红包啊,你要把这个红包系统完善的是很麻烦的啊,不是在我们这三言两语能说的清楚,我们只是来验证这么一个可行性,我们注意看接下来啊子俊第二我们就不再展开什么年度总结,因为到最终嘛,我们抢完红包以后,这个红包最多24小时就回退,最多一天,但是我们这些记录,我们要计算你今年度啊,你发了多少,减了多少,那这个是后续另外一套逻辑了啊完沃olf我们干嘛呢?那么帕package OK,就给我把它呢返回。好,这个呢是我们的每次抢红包,这个呢是没有抢过,可以去抢,那接下来就是我们的第三种,就是干嘛呢,抢完了啊,第三种情况就是整个红包已经抢完了,对吧,你一点开我们都见过了,大家已经抢完了,那么这个时候就是瑞泰就是五个红包都没了。
56:02
OK,那么这儿就是我们这儿写一个吧,L扣的啊,比如说这随便写一个了就负一,然后告诉你红包抢完了,下次请早对吧,那么这个呢,是一个我们的一个判断,那么最终啊,弟兄们请看这个是不是在我们的if里面,这波没问题吧,这好,那接下来还有什么情况呢?那们弟兄们请看啊,我最终是不是还有一步。干嘛呢?三某个用户抢过了不可以作弊抢多次,那这种情况下就是一种兜抵到来弟兄们看没呢return啊,也就是我们这的r code,假设我们这这个值就是负二。
57:10
然后。直接告诉你message就等于。嗯,User ID这个用户。你已经抢过红包了,不能重新抢,好了我们来,同学们,基本上我们的这个程序到这就写完了。发红包涉及到一个拆分红包的二倍均值算法的一个算法,这个下面是我们的算法,那么接下来就是发一个抢一个,好,那么各位亲,我们来启动一下我们的ready,我们来做一下简单的测试,好我先暂停一下录屏。
58:01
同学们成功启动,来我们来测一下啊,那么这个地址呢,我呢提前给大家呢,准备好。来看一下啊,我们第一步是不是要先要send发个红包,来,各位请发个红包,大家请看。剩的100块钱发五个红包,那么大家请看我们这个key,这个红包的这个K,那么是不是就这个最终我们打出来的这个整形速度,就说明这个红包拆分放进了一个例子里面,分别是65,二,34 43,好,那么老规矩,至少我们发红包是通过了,那么来同学们请看这是不是有这么一个东东,那么LRA。粘贴这个K0到负一,大家请看现在是不是四三三四二十五六,是不是就是我们在代码里面写的,前台显示OK这个key,那么来把这个整形数组拆分了以后,返回前台发红包成功通过,好,那么接下来抢红包呢?那么来也就是我们刚才所执行的这个啊,当然现在这个ID呢。
59:19
我们稍微。换一下来同学们,我们现在发红包已经成功了,100块钱拆分成五个红包,OK,接下来我们就要验证我们的抢红包,抢红包可是有三种啊,第一个。五个用户对吧,每人一个,正常情况第二个抢完了对吧。第三种情况,对不起,这个用户你不能重复填,哎,所以说呢,同学们揉眼啊,我们呢,来看此时呢,这就是我们的第一个用户,大家请看,那现在是不是一号用户要去抢对应尾号是56CD的,尾号是56CD的这个红包,那么来破破出去一个,弟兄们请看前台他出去了谁?43,那么后台是不是也告诉你一号用户抢到了多少钱的红包,43的一个,好,那么接下来我们就是一号用户,那么二号用户呢,三十四一口气了,三号用户好,四号用户OK,那么来五号用户没问题吧,那么弟兄们。
60:29
Lawyer,先来看一下我们后台的,那么来弟兄们看一下我们。漏眼我们这个package啊,诶杨哥怎么就没有了呢?因为那个例子空了,我们现在是不是五个红包,大家请看12345,五个红包没问题吧,每个用户抢了多少,历历在目,那么来弟兄们。搁到这下面,我type啊,注意这个是叫consumer这个key啊,由于这个LIST5个红包已经抢完了,把这个K给取消了,那么来,所以说我们1TYPE这是个啥,是不是哈希h get wall,那么弟兄们我也不废话,直接过来,现在人家是不是就给你在哈希里面就记录了,一号用户抢了43块钱的一个红包,二号用户抢了34的一个红包,三号用户抢了两块钱的一个红包,弟兄们没有任何问题吧,OK,所以说整个红包正常功能过,那接下来杨哥,如果我又来第五个用户呢,我多吃多占,我还想抢一个,对不起,扣负2MESSAGE5,也就是说五号用户你已经抢过这个红包了,不能重新抢,哎,同样的一个用户,你不可以重复抢,再来。
61:43
接下来用户ID不会重复了,六呢,对不起,六号用户你过来一打开哟,红包已经抢完了,那么也就说超过五以后,整个红包你过来了能看到那个图片,但是这个红包已经结束,已经抢完了,OK,好,那么同学们这个就是我们用对应的ready完成我们抢红包的功能,好那么同学们不妨我们呢再来一次啊,我们来这有一个多学一多学一首是上述案例,假设有许多个红包呢,你如何批量删除啊,那么来弟兄们搁到这儿多学一招,假如说啊,还是他100块钱五个,来弟兄们请看。
62:28
现在我这个ID是不是就换了,那么现在呢,我们这个ID啊kiss新大家请看我最新的啊,这是不是叫281C这么一个好弟兄们请看一眼,再来一次281C啊假设哦,这个是已经过去的啊,上一步281C34,那么来两个同学们请看现在list还没有抢完的红包,我们再来看T是不是有对应的28281C这个红包五个里面已经被拿来抢两个,但是呢,2814对应的这个红包consumer哪些个用户消费过,哪些个用户抢夺过,所以说h get5来弟兄们直接拷贝已粘贴,大家请看是不是一号用户抢过34的一个红包,二号用户抢过28的红包,所以说红包没抢完还在这儿呢,谁抢了对应的编号281C2814,给我记录下来明白,那么接下来啊,弟兄们请看,现在有。
63:28
这么多key越来越麻烦了,你挨个挨个杀你没问题,杨哥delete,我靠,拷贝烦死你了对吧?所以说呢,我们直接这么干,在这有个red在外面啊,Linu外面red client key红包嘛,Red package新,然后XS可变参数red client,但delete塔,那这个是个什么意思呢,同学们。Client-A123456,然后呢,Kiss这red新管道。
64:04
然后呢,上一个命令的结果集可以作为数参数传递给下一个命令X2可变参数,那么就是red client-A123456,然后干嘛delete弟兄们一回车,大家请看是不是就一口气删除了三个。以RA开头的东东,那么换句话说说这三个都是RA的开头,没了吧,哎,所以说同学们这个就是什么?告诉大家如何批量删除这个红包,或者是批量删除某些固定前缀开头的ready命令,好,那么同学们,我们的案例实战微信红包全部讲完,OK,各位亲爱的股粉,到这我们ready这门课程彻底完结,感谢大家的聆听,你不用去菜市场卖鱼,但是一定要来上硅谷学习,看杨哥视频,做翻身男人,再次感谢大家的聆听和学习,我们到此结束2023年我们spring cloud第三季新视频,再见,谢谢大家,请大家加油。
我来说两句