00:00
下面同学们我们来设计一个高并发下面的点赞计数器,来看看这个性能,题目呢来自于这个和我们的这一个,首先啊,我们模拟现在在双11这样高并发大流量的系统,下面假设啊某个商品或者你在哔哩哔哩上某个博主在进行视频。播放这个时候你非常喜欢它狂点赞,那么注意这个时候你的点赞速要求的什么?吞吐量要极高,但是呢,不一定要求你这个数据绝对绝对的精确,也就是说接近百分之,比如说98%,因为你在统计的时候,别人也正在点着,你永远不可能是做到绝对实时精准,所以说只能是相对,但是只要数据差距不太大就OK。那么为什么JAVA8这个手册会有这么一个东东呢?直白的说一句,在高并发下面的这样大数据点赞,那么建议用用,理由如下,大家请看。
01:00
这四个类是后面加了八新出的,我们以它作为突破口,Long either上面相关的介绍在这有一句话,当多个线程更新用于收集统计信息,那么类似于有多少个人对这个哔哩哔哩B站上某个博主。点赞了,要收集它的统计信息,但不用于细粒度的同步控制目的公共求和的时候,这个类通常由于奥米long注意在低更新征用下,这两个类具有相似的特征,也就是说假设并发强度不高,你用哪个都无所谓,但是注意高真用的情况下,这一类的预期吞吐量明显提高,能理解吗?龙挨达所以说他来做这样的。不要求绝对精准实时的高并发大数据的统计,它非常合适,那么代价是空间消耗更高,那这个呢,你也不用担心,你现在硬件和阿里云对吧,空间不重要,广告。
02:00
最重要的你的预期的吞吐量要很高,高并发实时系统来,所以说呢,完了玩会儿以后我们就来看看这个点赞计数器。我们呢该如何使用,首先我们呢来看一下这个常用API。打开扇。啊,这个呢,是我从官网上抓下来的常见常用的API啊,没有全部啊,主流的就是这些,大家可以看得出,龙挨呢,也就是这些加。是减。求和相关的API操作,那么这个I呢,就是将当前调只加X,这个X呢,你想加多少就加多少,如果你不写,默认点一下就加个一,但是重要的方法呢,是这个sum,它是一个求和。返回当前值。那么要注意的是,在没有并发更新value值的情况下,萨姆会返回一个什么精确值啊,就是我在统计的时候也没有人再继续做操作了,那么这个时候我就是个精确值啊,但是怕就怕在比如说某个时间点我需要统计,但是这个时候外面的人疯狂的也还在点赞,对吧,这个操作也还在进行的,那对不起,我所返回的只是此时此刻,这一瞬间我的值是多少就是多少,因为我在统计的时候别人也还在做着,那么这个sum不保证返回精确值,OK,那么这个reet是将value重置为零,那么这个呢是两者的合并,返回了以后再重置为零,好,那么这个呢,就是我们常用apipi,那么接下来我们来来进行代码演示,把这两个一块儿给大家进行入门级别的API调用,给大家讲解。
03:33
那么来它呢?是这个ADD,那么大家露眼啊,这些方法呢,都来自于这accumulator,那么也和它差不多,但是呢,两者还是有点区别,这个呢更复杂一些,我们一块讲好,那么下面呢,我们来吧,尿,No either。获得它,那么接下来呢,我们都晓得啊,这个increasement,那么来抵其实而人,其实质而言掉的就是at加个OK,好,那么现在。
04:04
我加了三次。用挨叠。上来看一下源代码。返回一个求和的值啊,至于说这些是什么,后面我们源码分析的时候咱们再说,但是请看上面的解释啊,返回当前的求和这个值啊,注意这个返回的值is not,它不是一个原子性的快照返回操作,OK,因为你看没有加SNCH好吧,也就说我在统计的时候,那么为了解决并发这个问题,也允许别人呢来进行相关的操作,反正你你做你的,我统计我的,好,那么大家请看我们现在呢,运行一下这个long either。加了三次求和应该很简单吧,So easy,就跟hello word一样,这些都是一些API的调用,只是让大家入门熟悉一下,我们来不再过多的展开,那接下来我们来说一下no accul,那么它呢?和上面这个又有什么区别和不一样?大家请看构造方法马上报错。好,那么来看看这个和这个它们两个类型一样,但是一个是A,一个是accumulator,它们两个有什么区别?
05:12
走。首先用艾达只能用来计算什么加法,且只能从零开始计算。那么我们看一下这个构造方法,它跟你说的意思是创建一个初始总和为几为零的。一个新的加法器,那假设我的这个累加,或者我的这个统计我不想从零开始呢?弄挨达就不大合适了。第二个问题,弄A只能是什么累加,它所有API方法刚才我们都过了一遍,那假设我想做别的操作。我想加减乘除别的更复杂的操作呢?那么所以说它呢,远远不够,所以我们有一个long accumulator,好,那么同学们,我们再来一个。Acculator。搁到这儿,看看它的构造方法,使用给定的累加计函数和标识元素创建什么新的实例,也即它的构造方法有个long BA operator,那么这个就是什么类型,Baary我们说过是两个,那么这个100%底层就是一个函数始接口,那么long identity,那这个就应该是个初始值,所以说它的初始方法应该有两个。好,那么同学们,我们。
06:19
过来看一下它构造方法的源代码。来。这个accumulator function我们都学过,Function函数是不是一定有输入,然后再有输出来,请大家看这个函数是不是个函数式接口,这个这个这个没问题吧,那么所以说它这left和right就告诉你第一个操作,第二个操作数,也即有第一个,第二个可以中间带着操作加减乘除,那么它的运算的范围要比long挨更强,这是第一个第二个,那么同学们我们呢?来看一眼,它搁到这儿,完活以后,我们回到我们的这个方法,呃,跑到这了以后,它这有个identity identity叫什么初始化值啊,对于做累加函数的。
07:04
初始,那么也就说假设我们从零开始,那么就写零,从五开始就写五,好,那么同学们,这个会了以后我们来吧。那么按照我们刚才所说,人家要叫你传的是一个什么,有两个的一个function的函数接口,那么输入有输出,那么XY。OK,那么接下来X啊,那么加上Y,就是我们的返回,你从几开始,从零没问题吧,那么龙accul那么来吧,那么在这块accul来,你跟谁累加,比如说啊,我们现在相当于说初始值就是零,你要跟谁累加是一,相当于这个零就是这个X啊,这个一就是Y,那么零加一是多少?那么现在我们的答案就应该是一,OK,那么我再加一个。三假设啊,相当于说经过这一轮的时候,我这个值二就已经从零变成了什么,加了以后变成了一,那么再来一组,上一步的这个一将会作为这个X啊,跟下一步你传起来的这个三加在一块,那么这个时候一加三,这个时候我的值应该是几,就应该是四,OK,它是做这样的累加操作好,那么同学们,那么long accumul点。
08:18
大家请看我这儿也有一个什么get,好,那么来吧。已运行。那么大家漏眼这两个方法,这个上面是三,这个是四,和我们的推断一样吧,好,那假设啊,如果在这你要是看不懂的话呢,那么我换一套方法来给你整明白啊,那么来它呢,这就尿。干这么一个事,OK,我们刚才是用拉姆达表达式啊,那么拉姆达表达式的前身是不是叫匿名类不类?OK,那么我们这儿你看就把这个方法弄出来,Left和right返回什么零,但是这个构造方法里面。解决了,后面还有还有一个什么。初始值,所以说跟刚才一样,我们从零开始啊,那么如果有迷惑的同学。
09:04
我不妨呢打个断点给同学们呢,讲清楚来,我们现在呢。和刚才一样,也是来运行这个啊,运行到这儿我们debug分析一下。有什么叫left或者right?哦,抱歉,这一块的话写的稍微有点不对啊,那么我们这应该是什么?Left加上right,明白了吧,比如说long accumulator,它可以包含加减乘除,如果我这写成乘,那么就是乘,那么我们这写成加就是加,OK,刚才那首物这块没有改完,就给大家呢,第八个,那么再来,现在我们的初始值是零,来同学们一步步走。走,大家请看现在是不是left是零什么意思啊,它呢,就是我们这个初始值right,就是我传进来的这个动作,OK,那么现在就是零加一是多少,那们来吧,弟兄们,这个accul现在的新的值就是几是一了,然后一又跟这个三。
10:03
开始进行累加求和来,那么下在大家请看上一步得到的是这个一,这个一就是我们这这个left新传过来acaul这个函数里面的新的参输入参数是几是三,那么一加三了以后,这是不是一加三,那么就是我们的四这一波OK吧,那么自然而然我们这是加法,那么如果是我变成减法或者乘法,那么如法炮制,我们在这儿就不再啰嗦了。好,所以说我们通通过这我们就可以获得long acamul比这个long either功能更强大,一支持更多的计算方法,加减乘除。第二个可以自定义,那么你不从零开始,你就是从九开始也是一样OK,好,那么这个就是我们这两个类入门级别的相关介绍,那么接下来我们就来看看弄挨它高性能。相关的复杂案例。
我来说两句