00:00
各位同学大家好,我们继续上一讲,给大家总体概述了大场高阶篇的全部课程大纲和学习要求,那么接下来我们正式进入大肠高阶篇的第一章red单线程和多线程的什么入门篇?那么自然而然有入门篇,100%有高阶篇,那么为什么一个单线程和多线程这么一个知识,我要把它分成上下两部分呢?那么这个下又在哪呢?那请同学们。知习提前剧透,这个是入门篇,这个是最后的深度解析的进阶篇,也记统一要给同学们回答raus为什么这么快,高性能设计指E函数和IO多路复用,这个涉及到unx。底层操作系统相关知识以及我们的对应的unix的一函数。不把这个说明白,你是没有办法回答两个根本的问题,一、RA到底是单线程还是多线程,二。
01:11
为什么red这么快?有没有听说过什么叫I欧多多妇幼,所以为了保证大家良好的学习效果,故此将这个知识点拆分成上下两部分,前后照应,承上启下,息息相关的。所以说,请同学们。按照我的节奏,先听入门篇,最后请同学们坚持到最后,听完到第12章的还有多罗夫用的深度解析,拿下对应的高阶知识来,同学们,那么下面呢,我们正式进入开奖。首课重要第一个知识点,后续我们深度讲解,那么为了避免大家吸收晕菜,所以我们先这一章是叫什么入门,也就先预习混个耳熟,我不要求你听懂,你只需要有一个大致的印象,能够懂个七八成就行了。到最后我讲埃欧多路复用和一函数底层C的这些解析的时候,我会说同学们,前面我们是不是说过什么?哎,那么这样的话减少大家的陌生感啊,相当于呢?
02:20
新冠疫苗先打第一针,再打第二针,第三针,保证大家良好的吸收,效果好。那么同学们。我们把大纲说明白,那么接下来就来看看这一章所延伸出来的东西,那么前面大厂高阶篇简介和闲聊的时候说过,主要解决两个问题,这部分第一个red大场面试题,第二个red一线使用实际工程案例和架构设计,主要是这两块。所以面试题说话一。
03:01
请问RA到底是单线程还是多线程?谈谈你的理解?单还是多读一把,True还是副词,还是既有单又有多,单中有多,多中有单。好,第二个IO多路复用,聊聊一上来啊,就问你这种东东。第二个,为什么这么快?好。那么这些。不多说,不展开了,换句话说,这一切的面试题都是这个知识的深度解析和说明,那么接下来我们就来唠唠red到底是单线程还是多线程或者这些面试题啊,我想暂停一下录屏,我想听听同学们你们的回答,知道的同学请把你们的答案写在我们对话框,我先暂停一下录屏,那么首先感谢各位同学的回复啊,大部分同学呢,打错了啊,比如说为什么这么快啊,有同学就说因为他在内存里面对吧?啊,这个呢,我不能说你错了,但是呢,这样的回答的程度是不可能让面试官。
04:10
舒服和满意的好。那么同学们,带着这些问题,咱们开始第一个为什么选择单线程。来吧,那么首先它是什么呢?我们呢,先来说一下这样的,你说red是单线程还是多线程的,这样的说法其实并不严谨,那么为什么这么说呢?那么在开始之前啊,同学们,我先问大家一个问题,请问Java是否支持泛行?你会怎么回答我?你肯定说废话,杨哥当然支持了。真的吗?好,那么这个问题我再来一个,请问Java是否支持拉姆达表达式?你会怎么回答我?你肯定说,当然支持啊,这还有什么好说的?
05:07
那么上面请问这样的回答,你觉得是对还是错呢?那别忘了什么东道,如果纯学术的交流啊,咱们现在来说,这有个东西叫版本,说简单一点,同学们以在座各位都是九零后了,甚至零零后都出来了,你们学Java可能一开始就是JAVA8,你当然觉得这个。顺其自然,理所应当,他应该支持泛型,应该支持拉的表达式啊,可是你别忘了,在JAVA5之前是根本没有泛型这种说法的,比如说杨哥大概是20年前入行的,我们那个时候用的GDK是JDK1.4,也就JAVA4,根本就没有什么叫泛型,我们都是强制类型转换,那么一样是不是从加VA8开始才会有拉姆的表达式,所以。同理,对标的思维方式来学,来问你到底是不是?
06:05
多线程的,那么基本上要答这么一句话,看版本RED4之后才慢慢支持多线程,直到六七后才稳定回答完毕。所以说同学们。请跟着来第一个。Red的版本是3467对吧?版本不同,架构也是不一样,GDK版本不一样,支持特性也是不一样的,不限定你来版本来问是单线程还是多线程是不太严谨的问法,所以同学们,一,如果你是RED3甚至更早以前的版本,那么也就是大家口口相传的red是单线程的,这是对的,然过2016年我所讲解的red就是3.0版,那个时候基本上2016年左右啊,大家都在说red是单线程的,他什么时候开始在说red支持多线程的呢?那么来。
07:10
四点叉这个版本以后,严格意义上来说。也不是单线程了,而是负责处理客户端请求的线程是单线程,但是开始加了点多线程的东西,比如说异步删除。持久化RDPAF,注意我这写了个什么叫貌似也就说在四这块犹抱琵琶半遮面,扭扭捏捏没全形,换句话说它干嘛部分支持啊,多线程啥意思呢?那么同学们都清楚,我们是不是学过一个东西叫L啊,那么这4.0支不支持这个支持L的话。你主线程set k1V1,我在干个活,假设你现在后台某个文件满了,它是不是有个东西叫LF的rewrite,叫LF重写对吧?或者RDB到定时以后,它会给你重新形成一个大MP文件,那么这个时候主线程它可能忙不开,它自然而然要剥离的一个新的线程去处理这个事情,对吧?所以说这种情况下他还是抱残守却非常头铁,固执的坚持单线程是没有办法完成这么好的效果的,那么接下来继续到第三步,2020年五月份RE6之后及2022年七之后的版本,大家。
08:34
告别了大家印象中的单线程,用一种全新的多线程来解决架构和各种性能反问的问题实锤。所以同学们可以看得出,如果你要回答RA是单还是多,那么请对底层的它的版本迭代和时间轴有一个了解,可以这么讲,也即在四之前。几乎是。
09:01
部分支持或者说几乎不再支持多线程的,即便四也是擦边球,本质上还是单,但是从5.0甚至是6.0,包括现在的7.0,也即从2020年五月份以后,RED6出来以后,实锤都支持了多线程IO,所以5.0版本直接升级到六,有了两年前的事了啊,那么对于这个激进的升级,也就是安特雷斯之父呢,花了很大的力气啊,因为到后面发现就是red用的越来越广,仅凭一个单线程一招鲜吃片天做不到了,所以他想ready更好的生存和发展,慢慢的也不得不可耻的屈服,屈服了变成了自己曾经讨厌的那个人干嘛?从6.0开始完全支持多线程IO,那当然RED7版本也更加厉害,OK,好,那么这个就是red。
10:01
渐进式的,为什么慢慢的从选择单线程到多线程。通过上一讲,我们明白了。从六到现在的七,Red早就支持多线程了。那么。回顾这个历史,它当年它为什么要选择red是单线程呢?来吧,首先我们要理清一个事实啊,我们通常所说的,比如说以前我们常说是单线程,究竟是什么意思啊?同学们,我们先来看一个命令,那么假设啊,Server my直接连上来。好,同学们请看SK1键位,Get k键,我现在大家没有任何问题,我想问的是,这是一个写操作给我切。只要是高并发,那么同学们多线程的环境下,我在做一个写操作,是有可能别的线程来跟我抢的,那么这个时候请问我在操作这些命令时候,我有没有向Java里面写什么lock?
11:09
安洛克,先获得一把锁,然后再写操作,然后再解锁,我没这么干吧,对吧?好,从我们的。连接,再到我们跟主服务器客户端发送这个命令给主服务器,然后获得我们的结果返回等等,从头到尾,同学们,我们没干过什么,洛克,按洛克吧,那么好,来吧。先来看是单线程,主要是这样的。是指网络IO和建值对的读写是由GI同一个线程来完成的,那么在处理客户端的请求时,包括获取socket的读解线、执行内容返回等都是由一个顺序串行的什么鬼主线程来处理的,这个就是所谓的单线程。
12:03
哎,这也是对外提供禁止存储服务的主要流程,那么来请看啊,采用的是react模式,就是反应模式啊,当然我们一般不说反应反应堆这个意思。都是用它的反应模式的网络IO,对于一个客户端的请求,主线程负责一个完整的处理过程,情况这样什么叫读取socketit呢?来同学们,现在杨哥这个是个客服端,我的red在后台起着了,那么我write client首先要告诉人家密码吧,然后呢,杠P6379不写示默认要告诉人家端口号吧,对吧,一回车,那比如说是否加杠C,是不是连集群等等,那么这一步就是我们这儿所说的什么东东。读取socket,解析这些用户名、密码、连接参数,然后注意这叫什么通道,连接成功以后叫执行操作,来执行了个啥?SK1V1给你返回了个什么?OK,那这个时候我一连接成功,是不是我这个客户端跟我们的red服务器建立了一场soet连接,客户端连接到了主red服务,然后soet链接成功了以后,那么客户端输入这个命令,操作Linux和redx的内核来进行数据的交换,最终它会把这个结果写入soet以后给你返回,所以这个过程也就是我们常先所说的从头到尾。
13:36
我都是原子的这个命令级别啊,就是set k1V1,不会有人来跟我讲,因为这个原天生这种东东就是单线程,都是我一个人在玩,不会有人跟我抢,没有必要去加速,但是各位亲,Red的其他功能,比如说持久化,R d b off,一步删除数据集群等等,它是由额外线程执行的,所以RA命令的工作线程是什么?
14:06
单线程的,也即只要你red写任何一个命令,这些都是原子的,但是整个来说到6.0以后,它开始是多线程的,最经典的我们RDB要给你备份时间,到了一定时间内,次数到了,我是不是要兴起一个线程给你搞定,有点类似于我们学过的什么东道是不是?各位亲,我们在guc里面是不是学过一个东西叫future。Task或者叫我们的接口讲过吧,也记啊,如果我这是个主线程。现在假设我K1 V1 get k1 delete k1,或者是TTL什么的,这些命令都是原子的。但是突然。在一定时间间隔以内,我要启动RDP和AF,我不能中断我这个主线程啊,我会干嘛,相当于说在这是不是会后台咋地兴起一个魁宝线程对吧?带返回参数的,那么去做一些长难复杂的事,尽量的不中断我的主线程,那么这种效果是一样的,所以现在RA的变化已经改了,是一个整体。
15:28
它是个多线程的,但是执行它自己的这些原子类的这些命令,也就是我们之前讲过那十大类型的命令,它还依旧保持着单线程原子类的操作,OK,好,那么这些眼镜情况我们继续,首先它为什么。在3.0以前。要采用单线程呢,来吧。他为什么快?基于内存当然要比磁盘要快。没有磁盘IO。
16:02
Red所有数据都放在内存里面,运算都是内存级别的,从硬件的角度都要比硬盘AO性能要好,速度要快。第二个数据结构简单,因为red的数据结构是专门设计的,这些简单的数据结构的查找操作,大部分时间的复杂度都是O1,说白了,TV间质盾。第三一个就是我们最经典的IO多路复用和什么非阻塞IO red使用IO多路复用功能来监听多个是吧?Soet连接客户端,这句话很要命啊,待会我们会详细展开,这样就可以使用一个线程来处理什么多个请求,减少线程切换带来的开销,避免了IO阻塞。好。那么这句话我相信目前到这儿第一次听的同学应该是或多或少有点懵逼的,这也就是red回答人家为什么要快最重要的。
17:02
有个回答多了复用非阻塞,好,接下来第四避免上下面切换,因为单线程模型我们没有什么持有锁这种东西,对吧,不会说这个锁wait什么no t范没有,因此就避免了不必要上下面切换和多线程竞争,多线程进程是不是为了保证顺序要加锁,这样就省去了。切切换带来的时间和性能上的消耗,单线程不会有思索问题这样产生,所以它单线程它不是一无是处,一开始red就是这么干的,但是架不住啊,我们发展怎么来?同学们,首先我们来看一下看看官网这句话。我们提前打开这。有这么一个说法。How can red use,你既然是单线程的话,那么你red怎么用多核对吧,现在的硬件什么意思啊,就是说从硬件发展的角度啊,我们大家都清楚啊。
18:07
八核的CPU根本就不叫什么新闻了,但是如果你只有一个线程,我这有八个人可以为你提供服务,如果你还是不晓得跟进,那么你red的性能是不是提不上去啊?所以在这这段话就非常重要,那么同学们请看。第一个这段是以前对于这个问题的标题和答案,这是他当年一年前观完,然后他把它拿下来了,为什么?因为我们的red啊,它不再是一个单线程了,从6.0以后,所以你看它的说法是这样的。It's not very frequently,也就是说并不是非常频繁的CPU会变成你red的瓶颈,直接告诉你了这段话,Red的瓶颈不在CPU,但是一般而言,Red它的瓶要么是在内存,要么是在network band网络与之相关的。所以这圈我们同学们,我给大家做一下翻译,我就不再照本宣科了,一看就会。
19:14
重要的下面这句话也记red4.0之后,因为从硬件的发展角度,CPU是多核的了,你这个red还是单核的,那么相当来说硬件发展的比你软件的架构还要好,那你这个red如果还是爆仓手缺,现在3.00啊,永远是用我们的什么啊单线程架构是不是有点跟不上时代?所以从4.0开始啊,我们干嘛make red more thread的,就是慢慢的尝试着red具有更多的线程,那么目前也就是在4.0这个版本,仅限于在后台删除对象以及阻止通过red的模块实现的命令。对于将来的版本计划是使red越来越什么线程化,越来越支持多线程,所以从2020年五月份red6.0横空出世以后。
20:01
这个就被拿掉了,在官网上的内容就变成了这样一个,人家就把这句话给去掉了,就怕你抓到把柄,所以说也即从这现在开始,从六就支持了,那更不要说是,更不要说是七,所以已经是实锤。多线程支持,那么来吧,来到这上面那段话的意思对吧,我们已经翻译过了,只看红色部分就是red,它的瓶颈不在于CPU,那么自然而然。我们呢,就要想办法去优化它的什么内存或者网络。那么这你就。解释了,因为CPU不是瓶颈,那么自然就采用单线程的解决方案了,况且使用多线程也比较复杂,当年作者就是这么想的。那么后来随着硬件的发展,随着更多特性的要求,Red从四开始不得不慢慢的支持读线程,OK,好,那么RED4之前一直采用单线程的主要原因有以下三个来。
21:07
使用单线程,那么当然是简单,第二个使用单线程也并发的处理了多负客多客服端的请求,其实它主要快是用IO,多路复用和非阻塞IO。那么对于red系统来说,第三个原因,主要的性能瓶颈指内存或者网络带宽,而并非CPU,所以这也就是为什么register当年他选择单线程的原因。
我来说两句