00:00
好,同学们,面试题和前题交代完了,接下来直奔主题,那杨哥我们来分析red的源码在哪啊?那下面lawyer首先register7.0.5作为我本次的源码讲解的范本,Src目录,下面同学们请看啊,你官网上是不是下red的源码包,差点GZ解压以后有个RED7点。0.5S2C,看吧,就这么多,好,那么接下来老爷。首先red是一个开源使用C语言所编写的,基于此,那么在压缩包源码包解压以后的src路径下面有这么这么多C和H为后缀的一些原文件,那么这个H有点类似于是一种什么had头文件引入的头文件,类似于我们Java的input导入的包,它是强调定义,而C强调的是什么真真正正的落地的实现。那么弟兄们我们来搂一眼啊,那杨哥该怎么看呢?然后我现在说你去看一下这个源码吧,把这些都给你,这个就是red精华。好不说别的来,弟兄们不废话,咱们是不是经常说?
01:19
哈希,这是不是有T哈西点C,咱们是不是经常说list stream list this等等等等,那我就还没减,大致你也应该明白了。原来我们在。客普图案写个set k1V一百分之百,是不是要用到底层的t string.c这个源码跟我们来进行处理,OK,好,所以呢,这个告诉大家我们源码的地址在哪?第二个大家怎么看?后面会说,那你说啊,杨哥除了这五大数据类型,还有一些其他乱七八糟的什么东东,那么该怎么看呢?最经典的弟兄们,我们有没有讲过replication复制啊,那么再来,有没有说过一种东西叫RDB和a of,弟兄们这么说能跟上,所以说在这块啊,统统给你安排的明明白白,那么基于此,我们当然了要搞清楚。
02:16
什么语言C,所以说待会部分C语言零基础的同学也没关系,学得懂的地方你仔细学,学不懂的地方你先硬着头皮学好吧,那么要给大家讲清楚,那假如说我们在这儿red里面set k1为一,我们在API层面敲了这么一个命令,那么底层实质而言,它调的是个什么呢?要给大家呢,简单的做一下说明,好,这是我们的第一部分,源码在哪,第二部分没什么好说的,互相对照和印证,有哪些bug,哪些问题,那么最终弟兄们。Get上面red red官网,在这块是我们red最新的源码及相关的介绍,后面比如说我们讲list pack紧凑列表的时候,这个东东也是用得到的,好我们这两块来给大家进行说明,那么接下来呢,我们继续。
03:14
那杨哥我现在先说明白啊,我们这个只是作为一张,完全是针对于面试,所以不可能穷尽里面的所有后缀是C的每一个文件的源码分析,不废话,Java有这么多API,哪个培训机构有本事把所有的API都给你讲完了以后,咱们才去学Java的。只是告诉大家突破口常见常用的,所以如果我讲完了主流面试常考的,你觉得你个人工作当中确实需要更进一步的深度阅读这些源码,那么杨哥个人推荐两本参考书,明说了,你们看一下源码就知道了,别胡说八道,这些源码莫名其妙的,你现在去看为什么要引入这些东东,不大可能,除非你是原作者,这些你把它搞搞懂了,你C语言大神了,好吧,所以说呢,站在巨人的肩膀上,那么在这儿推荐两本书,设计与实现,那么是我们机械工业出版社。
04:19
黄老师,黄建红老师所编写的,可以参考第二个RED5的设计源码分写,那么在这块是陈磊老师所编写的,可以参考也记,假如说我想穷尽里面的全部内容,那么各位同学你认认真真的看看这两本足够啊,但是还是那句话啊,你先掂量掂量清楚,量体裁衣,学以致用,如果你是这90%的。把杨哥这门视频看完,满足面试足矣。如果你是这12%,或者说个人极度有兴趣,就想了解KV建筑类缓存,那么源码加这两版书的辅助继续OK,好,那么这个呢,不多说了,就看你个人的定位的情况,那么接下来我们呢,就来唠唠这个src源码包,下面我们该如何看呢?
05:13
接下来我们探讨一下源码包,下面我们该怎么看呢?打开我们的源码包,全选165个项目,整个包我发给你,你去看吧。那么同学们,从学习方法上,你们觉得应该如何处理呢?好,接下来漏我们的分析思路是这样的。这么多,你该怎么看?165个项目都看,你告诉我,你从小学到大学,有哪一位老师是给你讲完新华字典的全部中文汉字,你才去阅读四大名著的,不用那么所以说一定是什么。两个问题,外面考什么我们就看什么,第二个分分类,哎,所以呢,这么多我们大家都清楚,你你你让我挨个挨个从A看到Z不可能对吧?按照英文二16个英文字母表的去看,那么咱们把它分分类,首先钢矩木张red基本数据结构骨架级的有哪一些?第二个外面考什么,有哪一些,咱们先看get up的官网说明啊,这个呢,我就不再打开了,他这other sit files直接告诉你has she list set the set stream等等等等,这些也就是我们经常所使用的。那第二个ae实现了ready的事件循环,SDs.C是ready的字符串类型的库,好,那么基于此,弟兄们,我们大家呢,就会明白,结合我们的。
06:52
官网来吧,分类了以后,首先right对象object.c啊,怎么right也有object.c种,懂不懂?哎,不用多说,只要你是Java程序员出身,一定听过一句话叫一切皆对象。
07:11
那么没办法,安特雷斯呢,斯之父,他要推广我们的red,也要借鉴其他语言,他所封装的思想那么一句话,我们在用的时候用哈希list set string。Stream stream set等等等等,请问同学们,咱们用的是五大数据类型或者十大数据类型,但底子而言是不是都是通通的高度抽象是个object,那么在这后面我们会详细介绍red高度抽象了以后用一个对象来表示,那么就是red object。好,先记着第这一个,第二个string list,哈希等等都说过了,但是数据流tea stream本次不做重点讲解,你只需要它底层是知道它是由list派检测列表和RX2个所构成一个数据流的数据结构就行了,因为现在外面没考,如果外面现在问起来了,2024年咱们呢,再接着干,好,这个是我们。
08:16
常见和通用的啊,俗称基本盘,那接下来同学们请看,在这儿是不是有句话叫SDs.C是red string library,那么所以我们重点要讲一个外面问的比较多的简单动态字符串SDSC,来,弟兄们请看SDs.C那么这道题目前面呢也聊过一嘴,他就会问你为什么write要自己建一套属于自己的字串,那么C语言原有的字符串。当然啊,C语严格来说C语言是没有字符串,它是用恰数组来进行字符数组来拼装了一个C语言内部的字符串。那么下面问题是C语言本身就是一门机器语言了,对吧?非常快,已经很好的性能呢,为什么重新来一套?好第二个整数集合inter set,那么来,弟兄们,大家请看inter set.c好,再来压缩列表z please,我们都混个眼熟啊z list.c再来快速列表quick list,那么弟兄们请看quick list.c再来list pack,这个叫什么紧凑列表啊,我们后面会讲,这是我们的一个重点,List pack可以这么讲啊。
09:35
RED7和RED6底层也发生了很大的变化,基本上到七以后已经把我们的什么quick克list差不多干掉了啊,但是他为了兼容它还是留着七以号,主要是说紧凑列表list pack好了,我们最终字典,我们大家都知道red是不是remote远程。Dictionary server,远程字典服务器,所以它底噪都要记录它的一种东东叫什么TV建筑,对,所以这提嘴这个dictionary dict这个C和我们的object叫C2个,几乎是贯穿了我们底层和用户API层面。
10:25
主流常用的两大接口。它们是最重要的两个类,所以在基本盘这请大家先了解,那么第二个数据库的实现啥意思啊?我们是不是说过一种东西叫write,实质而言也是什么内存数据库,那么自然而然你需要参考。借鉴其他数据库的底层实践,那么red之付安德雷斯呢?绝非无能之辈,人家能干出来red,那真的不是只懂C语言这一门语言,网络IO、数据库理论与概O设计,包括我们red存储算法等等,通通给你介绍和涵盖。所以在这我们有DB.c毕竟red既是远程字典服务器,还是一种内存数据库,两者兼而有之,最终暴露出对象write object,供Java程序员调用。
11:25
好,那么再来持久化RDB和A,那么弟兄们,Log,这是不是有我们东东的RDBOK吧,还有我们的什么a.C那么我们大家都清楚。Damp文件和aend only file怎么实现的,底层怎么调的?就是调的这两个C语言的源码文件,那当然啊,你要干坏事的话,打个包,你们公司抓的那些C语,你把这个里里面的语言改了,马上程序绝不是报错的问题,怎么搞都会把它搞死,OK,那再来我们red都晓得我们启动red是不是red.server然后呢,读取某个配置文件,我们client连接密码杠P6379连上去,怎么实现的,弟兄们搂眼,那么首先这些就是一些网络事件的驱动,那么有ae。
12:18
点C和Apple OK,那么这个呢,我们后面讲,那么也是IO多复用等等,那么网络连接有a net.c和networking服务端程序server.c也就是说我们写write server,读取某个配置文件,就一定会有这个serve server.c这个服务端的C语言文件给我们提供底层的支持,那么自然而然。Red client.c那么弟兄们咱们这个是不是也是跑不了啊?那么check LF啊,批处理的压测工具red client.c是不是通通都一样啊?那么这块全部过完再来,弟兄们都是老朋友了吧?主从复制啊,replication.c哨兵集群等等等等,那么我就不再一一讲解和备注了,但是呢,从这我们就会明白一。
13:14
基本盘就是这几个常用的数据类型,然后整个RA是怎么驱动的,就是这些数据结构,Y加这些C元的底层函数的调用,OK,好,那么在这我们呢就会明白了red源码包,下面就按照我们的分类和外面的面试题考察点,带着大家进行一下后续深入详细的解读。我们平时所说red是字典数据库,TVV建值对到底是怎么回事,它底层C语言的特征表现又是什么样的?在开篇之前我们介绍过,我们之前的源码的总体大纲的介绍强调过,第一个RA既是一个KV建制队,所以有个dictionary.c这么一个C语言的原文件做以支撑。第二个red也是一个内存数据库,所以MYS数据库、s server数据库、Oracle数据库,那些网络连接、验证、配置、IO等等,它也需要参考DB.c这是最底层的,那么我们在用的时候大家都清楚,比如说杨哥再写个代码下K1V1,这是我们最顶层给客户端用的API操作,那么当我一写以后,我们大家都清楚这个T。
14:38
是个字符串,这个value现在是个字符串,因为我是个string类型,但是如果我变成一个什么,而push list类型假设也叫K112345,这个K是不变的,但是这个value又变成了一个list,那么再来啊,同学们,我们h set这是个什么KVG止最哈希最经典的假设还是叫K1,好,K是不变的,那么ID11号c name张三,AGE25等等等等,这些都是大家非常熟悉的基础命令,我就不用全部都敲一遍,那么大家都清楚不变的是这个key,那么它的不管数据类型还是怎么着,几乎都是死string类型,改变的是不是这个value啊?哎,所以说我们刚才写了string类型,List类型,Harsh类型三个不同的类型,但是啊。
15:30
抽象以后都是获得一个object,俗称red object.c这么一个对象,给你统一涵盖并高度抽象,也就是它底层沟通的话,及时就是数据库启动了以后形成字典,最终提供出对象这样一种东西跟程序员调用好。大致我们先了解一个总体的介绍,下面细分它是怎样实现建筑对TV数据库的呢?来吧,弟兄们。
16:03
RA是KV存储系统实锤跑不了key,一般都是string类型的字符串,但是这个value就是各种不一样的RA对象,最经典的我们说过,比如说这个K还是K1,但是这个value现在是不是就是KV键值段啊,如果是它。现在变成SK,一为一,一一,这个时候是不是只有一个值啊?基于此,我们会明白我们的value对象可以是字符串,也可以是集合数据类型,比如说list、哈西、set this等等。那么基于此,我们大家就会明白,我们每选择一种类型敲对应的命令,这个key就是字符串,而这个value如果是子中类型字符。串给你搞定哈西PV建支队list一个集合,Set一个集合,Z set带分数的一个集合,所以我们下面就会得到真真真正key可以是固定的而变化的,我们的数据类型要分析的就是这个value流,好red到7.0以后几乎是十大类型,那么杨哥刚才你只说了这么几个呀,你不说十大吗?你只介绍了五个呀,那五个怎么办?我弟兄们老爷传统五大类型不说了,对吧?用type谱来看一眼对不对?那假设。
17:36
Tap k1,那么这个时候是不是就是死终类型,它是什么就是什么,这个好说,那关键是新介绍的这五大类型呢?弟兄们,我们呢,就来看一眼set好。0101做登录签收签到,大家请看什么类型string,再来看p fad,就是我们的hyper log log,大家请看type hyper log log2什么类型,Stream类型,再来看GE,什么类型the set类型,再来看my stream什么类型stream类型,再来看bit field k接咱们执行过个命令,也就be field是可以将一个ready串哎,看作是一个由二进制位组成的数组,并对这个数组任意拼移,进行我们对应的反问。前面说过了,不再啰嗦一句话,这个type现在K1是什么类型?死就类型,所以表面上看粗分是几个类型啊,十大类型这五个没什么好说的,通过我们介绍的这些十大类型的案例里后,我们大家都会清楚没有十大类型,因为bit map实质是string hyper log log实质是string GE实质是z set。
18:51
Stream实质是stream,只有它是独门独户,其他这两个几乎是stream的子类。go是我们的什么the set的词类,那么be field,它主要是对这个key里面的位偏移进行操作,那么具体看key,这个key是什么就是什么,那么基于词,我们也只有什么接近我。
19:14
然后呢,加上这个最新的这两个,那么大致啊,也就是什么七八种这么一种数据类型细分的话,OK,好,那么同学们这个是要了解,那接下来我们呢,完活整明白了,我们red从启动啊,比如说我们现在启动red server到这个,然后给它连上来到这个,然后进去客户端以后再进行命令的操作,我们从上帝视角把整一头的整明白,牢牢把握住这三个啊DB。Dictionary c object c,听好,我们操作是操作哈希list set stream stream set等等,实质而言,底子是有这些形成库,形成字典,封装成对象,跟我们调用API命令,那么看一眼来,这个就是right,从第一波是不是要启动right server,那么看看吧,Right server我们就要使用red DB,把我们的这些配置啊,把我们这些系统IO加载进去,启动这个服务以后,立刻在内存里面形成red DB,然后这个DB。
20:27
对于我们底层而言,它就是一张字典,就是一张报表,所以去找我们的dictionary,基于此一启动以后,大家请看啊,我们这是不是有我们对应的server.c这个启动读对应的,看配置文件,马上形成内存数据库,形成内存数据库以后去找对应的字典,字典就是KV键值,对,好在这块巴拉巴拉一大堆数字,形成我们的字典,好字典实质而言就是dictionary HT哈希表。
21:01
哎,慢慢的从底层偏向于上层,越来越接近人的习惯,我不懂那些C语言,你就给我K介指对,那么哈希表以后每一个T是不是会形成一个字典的N垂实体啊,那么这个实体也就是我们真正真正的TV建质对,然后它的雏形,那么雏形形成以后,你可以把它理解为这个地ctionary entry,在底层叫这个名字,封装到上层就是一个一个的KV建制对对象,然后它就指向我们的string list,哈希this set。OK,那么这个就是五大数据类型的结构,五大数类型的结构底噪,实质而言,也就是我们封装的这些什么list啊,压缩列表啊,字典表啊,整数集啊,跳表啊等等等等,哎,所以说我们的底子啊,就是由这些从网络到内存到IO,到字典到哈希,最终变成object对象,供我们来进行操作和使用。
22:03
接下来来说一下red object,那么这个red object呢,它呢高度浓缩并封装了一个结构体,用来表示string哈set等各种数据结构,请看这个value是不是就是这个对象,哎,这个对象我们前面说过了,你这个有通,你嘴巴上说叫string哈希list set this set,没问题,都叫这么一个,好,那么在开始之前允许杨哥先总体的介绍一遍,那么弟兄们呢,都明白啊,我们这么来理解,在我们Java这个层面,大家呢,一定听过什么东东是不是叫一切皆对象,我们有个组宗类叫object.java我相信只要你是加法程序,我现在说这个完全没有任何问题,学任何东西,咱们进行什么对等和对。
23:04
标的原则,那么现在我这是叫RA,那么Java里面叫一切皆对象,RA里面呢,干嘛呢,就是一切接KV,也就是我们的键值,对俗称字典,OK,那么好,这是啥意思呢?也就是说在red它又细分了两层。第一个在这个上面叫用户的API,哎,就说我们那些用的什么set k1V1那些命令,这是给人用的,给程序员用的,但是底子呢,我们大家都清楚,我呢底层是C语言,明白吗?好,上下起手,封装成一套规范命令API映射来勾。
24:01
上行下达,下行上达,所以在我们这底层,它就是一个K建制队,听好,就是我们的字典dictionary OK,那么在上面啊,我们前面说过了,你这有这么多类型write位于托管和便利方便,他在这搞了一个动作叫red object,对象的高度浓缩和抽象,也就是说你嘴巴上说那么多类型我不管,但是red而言,我只懂一个东西,就叫red object,它们两个几乎就是对应,就是KV,因为哈希KV是OE,时间复杂度是最快的,那么找出来的东不懂,我从底层找出来了,我要往上抛,抛出去以后给程雪儿去用啊,那么程雪儿尽量的是面向对象的思想,对吧,那么当然。
25:01
在C语言里面,这个有点知识需要大家了解,俗称ru结构体,我封装成一个结构体,你可以把它理解为就是个类,那么我不管你底层找的是string,哈希什么什么的,千奇百怪各种各样的TV建制队,哎,我把它封装成一个对象提供给你用,所以这个建制对尽量的,也就是符合我们家va的思想,封装成了一个对象。讲完了兄弟们好,那接下来我们来看一下,大家还记不记得我这儿说了,你底下找了各种复杂类型。我们往上抛,我不能说这次我抛上来一个哈希,这次我抛上来一个list,没有,越是高层的越是最简单,对吧?那么这个时候一句话,高端的代码往往只需要最简单的对象,朴素型的封装能够调出最佳的美味,所以呢,弟兄们,C里面他拿一个东西叫ru结构体语法先学习,说人话,就是我们Java里面的类的封装起,你下面给我什么,我就要封装成一个对象给用户去用,这个对象就叫write object,近似的理解啊,怎么来,请大家看,为了定义结构,你必须使用ru这么一个定义了。C语言的这个语法啊,很简单,现学现卖,Strus定义了一个或包含多个成员的新思路,我们大家都清楚啊,如果我们Java大家都明白,比如说public。
26:39
Class假设我这儿就是一个book类,那么一写下来了以后,由于我这需要有很多属性啊,比如说什么我们的int ID对吧,我们假设string book name对吧,我们假设string作者。等等等等,请问我这是不是需要有很多个few的属性,我们写的太多了,是不是需要有种封装的思想,一个类来包含,那么在C语言里面,同理它也是这样的,大家请看ru type name,然后object name name是结构体类型的名称。
27:22
然后member就是一些成员变量,可以是个in或者等等等等,那么最终我们呢,可以看这些语法一对照下来,Ru books,我们呢,定义了个字符串说明作者主题book it,最终它呢就是叫一个book,所以说在结构定义的末尾最后一个分号之前,你可以定义一个或者多个结构变量,也就是我这个是一个不可的实例,相当于说这是什么的什么选可选的下面就是一个结构体book变量为book,听明白了吗?所以这个就是我们加va的类XC语言里面也明白,假设啊,我这一个哈希,我这个在命令这个层面写了个h set,比如说哈希啊,K1ID11号,客户名字c name,张三,年龄25,那你告诉我是不是我这就有ID名字年龄,那么我在上面。
28:22
已设置或者要把它查出来,那么请告诉我,一查出来以后,底层是不是查出一个哈希,哎,那么这个哈希最终我需要封装成一个对象供程序而调用,所以呢,我们这个封装成一个对象就叫我们的ru,这是第一种结构体,第二种叫type DeFine。下面是一种更紧急定义什么结构体的方法,在CC源的源码里面大规模使用它的方法是叫这样的type def DeFine d啊。DeFine定义的英文缩写ru也是这样的,所以这个时候就会变成如果我们在Java里面这book了,那么是不是就book b1等于new book book b2等于new book,那么它这也是一样book,所以说这个都叫type DeFine就封装了一个类,那book就叫B1 book1book2明白,所以这个就是我们C语言的结构体,那么听好ready当中每个对象。
29:23
几乎都是一个object的一个结构体。
我来说两句