00:00
好,同学们,我们继续。SDS是什么?SDS为什么讲解清楚?接下来源码分析跟着来,当我们写一个set k1V1底层发生了什么?那么你三种编码格式它是内部如何转换的?那么下面请说一下这个调用关系,同学们请看。我现在赛诶K1,大家有没有发现有很多提啊,这些提示来自于哪?我们界面上是set k1V1,那么底层调我们的子句类型,它发生了什么呢?那么同学们请跟着我来第一个打开我们的源码,这有个T点。听下划线strange.c大家请看在286行set command好来,我们前面说过,真真正正的常见常用的是不是就这几个?所以找到我们的T_string.c这么一个C语言,搁到这286行左右,同学们请看在源码里面各位亲有没有发现一个东洞,这有个set command,好,就这么一点哦,那我们就会清楚了。原来当我们在red客户端写set k1V1的时候,底层其实质而言调用的是set command,大家看这些提示不陌生吧?那么搁到这儿他就会告诉你,我们这写set k1V1的时候,我有没有指定过期时间,没有吧?那么TTLK1什么鬼?是不是负一来在这块过期时间?
01:54
是,那时间的单位是秒,Flag叫o BG no flex,这是它的一些常量。那么来,如果是这样一种判断情况,直接return,这个方法不好使,否则的话请大家看。
02:09
它有什么东东,是不是有尝试object including就是你存在的这个value这个值。你用指针调用的是这么一个方法,这么一个方法呢,大致呢,也就是在前面这么一点,它的意思是你过来这我尝试着类型编码转换,转换完成以后得到这么一个东东传到这个方法里面,原来我们界面上写的set k1V1底子调的是set command,那么set command根据你传过来这个值大小和类型来做三大物理类型的转换,使in是嵌入式是raw,最终set general command这个方法来给你进行处理和完成,这么说弟兄们能不能清楚,也即最终我们实现的是这么一个家伙。
03:06
OK,那么上面呢,大家请看是不是什么SNX啊,一些标识啊,在这都给你定义了,所以它底子干的是这么一个事儿,由于我们的时间有限,就这么一个命令,我不可能逐寒逐秒的给大家呢,来进行这个解读,让大家明白哦,原来底层为什么我们要学三大物理编码类型,它有一个类型转换,那么在这我们大致的过一遍,因为毕竟我们是Java程学,掌握write去干活,满足面试即可,而不是C语言程序员巴拉巴拉读这么多,我相信我要从头给大家读完了以后你们睡倒一大片听懂,所以各位亲有个度。有兴趣的同学下去自行学习和解读,但说实话没必要啊,毕竟我们是Java程序,调用red干活多做做什么,用red发红包,用red做直播,Red附近的好友怎么怎么的,这些源码级别的,完全是为了应付面试。好,我们多说一嘴,接下来刷回来,我们大家都清楚了,这些提示啊,哪来的?
04:16
类型的转换编码的格式怎么处理的好?那么接下来三大物理编码方式,数字嵌入raw若未经加工原生超过44字节的,下面同学们漏一下它底层也记这个方法的转变逻辑是什么东东呢?来吧,首先我们先看数字型的编码。由于前面已经敲过,不再重复,你知道即可来set k,一,123是数字,同学们请看,当我们打这么一个命令,不管你这是写123还是写100 200 300都可以单字符串进止内容可以用一个64位的有符号整形来表示的时候,那么这个时候red会将间值化为long型来进行存储,也即对标我们的前面的常量定义ogco int这。
05:14
啰嗦一嘴。是不是就是我们这的o bgco int,它会做内部的类型转换和分配,所以我们呢,在源码层面直接告诉你调用一个常量,那么它内部的结构,String类型的SDS也是一个red object type什么类型,String编码方是什么类型,Int型LRU引用的记数多少次,最终指针指向的一个什么鬼,是不是就是我们的数字123,所以搁到这第一步没问题吧,第二步看一下大神写代码它的思路,它内部做了一个数据常量缓冲池,有点像我们Java里面的那个。
06:00
Integer大家都清楚啊,它呢是比如说128以内,对吧,它呢是可以复用的,好这块呢是加va的基础啊,我相信我希望你听懂我到底跟你说了个什么,那么接下来这么一个问题就来了,也借鉴了类似的思路,它是这么干的,启动的时候会预先建立1万个分别存储零到9999的RA对象作为什么共享对象,这就意味着如果S字符串的键值是在这个里面的话,可以直接指向共享对象,而不需要再建立新的对象,此时渐值不占空间。明白吗?好,请大家看啊,SK1我写了个123 SK2我也写了个123,请问123在不在1万以内,那么这个时候这个当然要先分配一个object,但是这个的话K2诶K是不一样的,VALUE1不一样一样且在多少以内,1万以内,所以它上面的object没有重新新建一个。
07:10
而是干了这么一件事,相当于说K1K2绝对是两个不同的T,但是他们却指向了同一个对象,有点类似于我们Java啊,比如说string s tr,这个时候123弟兄们没问题吧,这个叫K1,然后呢,我呢又干这么一件事。OK,那么123,但是在坐出常量成面,这个有没有已经有了那么几乎啊,可以把它近似的理解,等价于S12指向123 S2又给我指向同一个,我这个S2就不用重新申请一块内存,那么这个时候是不是两个引用或者叫两个指针指向同一个red object的对现听懂了吗?这啊,不管是123,一百两百三百都可以,只是说明一个数字,这个不重要,好,那们来,弟兄们请看。
08:05
源码分析,那杨哥你这说这个存储了1万个这么一个对象,哪定义的?请看server h就是服务器red刚启动的时候定义object共享的in多少,1万这个是个常量,OK,然后往下看,注意弟兄们几RED6的源代码,杨哥六跟七都给你们讲清楚,六和七对于死终类型SDS底层的动态字符串变化不大,那么来同学们,咱们先看六啊。在这个六的话,他就说了,检查一下我们可不可以表示这个字串做一个long形的in teacher OK,也就是我们这前面所说的干嘛转换为long型来进行存储,64位有符号整形,那么来吧,他这么干的ss length,也就是你这个字符串的length,如果是小于等于20,且这么一个string to length转换成功的话,字符串长度小于等于20,且字符串转漏成功的话,请看巴拉巴拉进来,然后干嘛?Page max memory,注意serve.max memory等于多少零啥意思啊?我们是不是说过这么一个东西,Can f讲内存淘汰的时候get max memory多少零代表64位操作系统下面几乎就是等价于物理机器的内存无上限,好,如果说等于这个零,并且我们在这块啊,当然这是或者啊,就是这个它等于零。
09:40
或者这个的政策等等,这些是条件判断配置max memory且值在1万以内,直接使用什么共享对象值看没有需inte values,哎,也就是我们在前面刚才所说的123,一二三两个K,但是1万以内直接在里面共享值否if else咋整你的coing我们来。
10:08
转换成int,然后指向我们真正的值,OK,好,这是我们六,那么七呢,大家请看啊,它呢叫object c,还是给大家看一眼吧,虽然说来回切换有点麻烦,六跟七的源码底子没变,但是呢,行号变了啊,他们写的东西多一些,在603行,大家请看,我们呢,在这儿有一个东西叫什么?尝试objectco,还记不记得这个?有印象吧,我们在这儿啊。下面我们这是不是说过一大堆东西。这try object includingding,那么来弟兄们,这是不是有try objectding,那么怎么来的long形的value,这个O指针直线length。好了,大家请看巴拉巴拉这一大堆的前面的验证和判断,或者返回,那么大家看看它是不是词中练习,如果是过到这请看,如果这个转换成功,那么就这一段对吧,你符合这个条件,那么共享的话,这个是不是在1万以内?来同学们请看,从共享池里面拿这个数字,然后return。
11:23
返回。否则的话,弟兄们要么。是raw,要么我们在这儿又是一个数字,或者最终我们就转换成GMB,所以说各位亲,这货几乎跟上面的是一模一样的,OK,好,这是我们的in特性,那么杨接下来给同学们介绍一下,因为B嵌入式字符串的。编码格式和底层源码分析开工大家都清楚,对于我们而言,数字的走这一只啊啊,只要是在范围以内,那么对于不是数字是字符串的就走这两个,其区别就是看是否大于44个字节,如果是44个字节以内,咱们走嵌入式这个,如果超过范围了走raw,好,最通用最常用的其实就是它。那么下面我们来捋一下我们的源码。
12:21
首先同学们都清楚SK1V1没问题吧?回到我们的原码,就是t string c,就是我们的set command。那么好了,你这是个数字还是个字符串,我得判断啊,在哪?大家请看我客户端是不是输上一个字符串,这有个try object including,由它来决定按照我们的条件匹配和范围给我们的value来设定它的物理编码格式到底是int还是emb还是raw,所以由它将会去调用object c这个里面的。
13:01
Try object。第二步能跟上吧,好,通过前面的讲解,这些呢,都是一些判断,如果条件各种不符合,直接就跳出去,然后。请看这一段。请大家看是不是刚才我们所说的是不是在1万以内,两个指针可以共用一个,共享时的引体角1万以内对吧?那么以记这一段就是我们的in特,那杨哥我们的emb嵌入式字符串在哪呢?就在下面,人家呢给你写的呢很清楚,如果你这个字符串长度是小于这个的话,那么定义这么一个灯道,大家请看最终是不是enb返回,他说如果是刚好符合这个条件,就把你这个O直接返回。否则的话,Enb这个指针这个对象在这儿要创建一个enb string对象,OK,所以就掉到了第三步这个方法,那么基于此,我们先把所有的过一遍,那么从头开始找来,大家请看它在这。
14:16
就是我们创建一个字符串硬币所使用的方法,如果不是数字,其实在符合条件44个字节以内,我们就创建硬币字符串,巴拉巴拉这一大段就是好。那么同学们漏他干了些什么事呢?请看他用的分配内存用的是哪个八认识加几加一,哎,写的相当牛逼啊,我们这儿先来简单的看一眼类型字符类型,然后编码就是type,就是string,编码就是硬B,然后这个指针的指向是SH,那么SH是什么?同学们请看这个就是我们的SH的动态字符串SS加起。
15:03
就加了一个一,这一点就是他写的牛逼和精巧的地方,好同学们原码找一遍,梳理完成,回到笔记,请看分解,首先它这跟你说了,如果是小于这个的话,就要走这个,刚才是不是看过了,那杨哥这什么动作在哪定义的啊,那请看我们在这块的话呢,大概是在这儿啊,它定义了一个东道是这这样一个情况,首先就看你的这个GB,这个size,它的设置常量是44,前面我们是不是说过不是数字,就是字符串,字符串里面又细分两种,如果是小于这个44,就给我走嵌入式的,如果是大于44就给我,就给我走raw的,所以说通过源码分析,我们就得到我现在假设就写个ABC3个,那么肯定是44以内,所以符合这个条件,对于长度小于44的,OK,圆满分析了啊,建制对采。
16:04
要嵌入式的这个方式啊,这个是这么一个意思啊,不读了,表示从内存结构上来讲,记字符串SS结构体去对应的rise of这个对象分纷在什么东东,同一块连续的内存空间,所以他们也没有重新新用一个,还是紧凑着用,所以到最后人家牛逼就牛逼,在这儿加个几就加个一,还是用我们这一块,哎,紧凑一点,那么来字符串SDS嵌入在RA object对象之中一样,待会我们说啊,那么通过原版这个分析,我们大家就看得出这加个一好了,那进一步我们来过一过这个方法,那么对应的是什么意思呢?请看加了几加了几,我们大家都清楚,对于我们的object typeco现在是叫什么嵌入式的ruu,最近最少使用的时长时间戳几个人引用PTY是不是叫直针,那么指向下一个对象,但是现在加几加一啥情况啥情况,就是这个指针指向我后移位,又让你分配了一个八分ABC,哎,相当于说我们两个内存分配相当紧凑,你还是跟我同用一块,我没有重新开辟空间,这么说能跟上也记我的下一个就是你嵌进去还是这个同一个re,我们我们这给的对象放在了这个里面,我们合拍下一步内存的下一个指针。
17:44
指向我,OK,所以各位亲,这个就是我们嵌入指针它所表现出来的。那么针对于上面数字嵌入讲完了一定要注意啊,它这块最牛逼的是这个绿色的,这个才叫red object。
18:05
下面这个是它没有重新申请一个新的object对象,只是加了一个一内存紧凑,实现了内存的高度连续,减少碎片,不占空间,所以一般而言,我们在SDS里面常用的就是它,好,那么接下来同学们请看。第三种。Raw绝对超过44个字的长度了,变成raw大于40长度的字节随便写,那么根据我们的源码我就不来回切换了啊。44要么范围以内创建嵌入,要么就是原声。当我大于44超长字符串的时候,Ready就会将内部的编码改为raw,这个就与NP不同之处在于此时动态字符串SD的内存与其依赖的对象不再连续了,所以同学们请看一眼啊。
19:07
我们回到我们的这个创建raw这么一个对象开始找,请大家看它就变成创建object,好再开始找,创建一个object以后怎么着,它是不是有点类似于开始给你重新分配了呀,这么说能跟上,OK,从源码的这个角度来分析,那么结合从原码回到我们这儿,就会变成对不起你在这块。PTY这个指针,那么可能就要指向下一个节点了。OK,它们的区别就在这数字嵌入尽量紧凑,让内存连续,如果高于44,这没办法了啊,在这块攒挤挤攒攒,也攒不出更多的空间给你用,只好新开片。所以说各位亲,我们在这块就会清楚,Raw其实就是什么大号版的。
20:07
字符串切不进去了,直接散开敞开用,这么说能跟上重新申请一个,OK,你看PT是不是指向另一块新的东东了?好,那么这个呢,就是我们的raw,对于我们的raw编码。几乎介绍完成前两种,懂了,这个应该是秒过,那么这它会有一个额外的一个动洞,就是假设我没有超过这个阈值,为什么会变成raw,这什么意思呢?同学们请看案例,SK3A肯定没有干到44吗?它呢是嵌入的,但是aend k3b。那么这个时候get k3是AB也没有到44,但是只要我改了一次以后。不好意思啊,Raw一句话判断不出来,就取最大的,它的意思是这样的啊,对于嵌入式的这样的SDS字符串。
21:03
由于其实线是只读的,因此在嵌入式对象进行修改的时候,都会先转换为raw再进行修改。因此只要是修改嵌入式的对象,修改后的对象一定是raw的,无论是否达到44个字节。我为了保证你的修改方便,干脆我就顶格处理给你最大的,我也不想判断是烟B还是RW,因为判断多了内存就慢,Right为了保证第一个一开始是多少,我给你判断出来就判断一次,后面如果你进行了这个K3,比如说A判是不是一些改动了,干脆顶格处理,直接告诉你raw,哎,就这么点小小的区别,好吧,那么这个小知识大家清楚就行了,那么raw就给大家介绍。
我来说两句