00:00
好,同学们,接下来给大家介绍一下SDS简单动态字符串,注意这个是考试面试的重点,下面我们先来看一下这么个东东,Set hello word,我相信大家绝对没有任何问题,这个key,这个是个字符串,那么怎么保存进我们这个K里面的呢?先来复习,假如现在要展现一个字串,这个字符串就叫ready,对吧?好了,那么词语言中字符串的展示,它是right,注意在我们的编程语言里面啊,Java c等等,他们呢?对应的字符串其实是用char数组来完成的,这个我相信是基操常识了,不再废话。那么对于我们red是用C语言所编写的,它呢,就认为如果屁股后面是个杠铃这样的啊。
01:04
代表字符串的中点,那么结合我们的write啊,因为write是由C所编写的,前面讲过这张图一切就是字典实体,那么来对于这个KSDS啊,对于这个value SDS,也即我们会清楚write没有直接复用C语言中的字符串,也就是搞这么一个字符数组啊,而是新建了一个属于自己的结构简单动态字符串SDS,那么在ready数据库里面包含字符串值的键值对都是由SDS所实现。OK,那么red中的所有建筑字符串底层就是SDS,一句话,对于red string底就是简单动态字符串SDS,那么right中所有值对象中包含的字符串都是由它来所实现的。那么接下来两个问题,这个SDS啊是什么?第二个。
02:06
它为什么要有这么一个结构?明明已经有字符数组可以近似的当做字符串来处理,它为什么要新建这么一个结构来?兄弟们,那么SDS长什么样是什么?先给大家混个眼熟看好结合上面这张图,我这儿不管写hello word还是hello,假设这个字符串是个这么一个value是值。SDS,请看长度。最下面它有一个什么存储实际内容是个什么东道,最下面就是C语言的字符数组,这个数组里面才出存取了,存进去了我们的字符串red这个值好,那么弟兄们接下来我们就要唠唠SDS它是个什么东东,首先源码说话,这个呢,是在SDSH在这么一个头文件的定义,这来弟兄们请看。
03:11
搁到这在我们这一,诶手握啊,我们重新点开一下,在43行,在这块sdh简单动态这串定义,这type DeFine char什么通道是不是就是我们SD啊好,请大家看它的内部结构,五八十六,32 64几个。是不是12345共有五个之多呀,那么每一个它是什么意思呢?请看对于这个86 32 64,它们里面肚子里面的货都一样,每定义中一个ru结构体相当于封装一个类一样啊。近似的理解,Length代表字符串长度AOC分配的空间,Flex是SDS的类型,也即是三还是五还是多少,然后这个恰八法才是字节数组,真真正正的你一个一个字符,字符存进去的是存到这个里面。好,那么我们来简单的说明一下啊,那么对于我们一个字符串,它的值最大是512兆B。
04:29
由四个构成来以八为例,当前字符数组的长度,这些我就不再废话的作用是这样的,弟兄们,它有多个,就是为了什么类型匹配。是五,是八,是16,是32还是64,根据我们不同的内容,我们可以告诉你它存取的大小和长度分别是多少,如果你用八这个东东,字节是多少啊,256,如果你用16这个东东,那么也就是我们在这儿啊所强调的用这么一个,对吧?你能分配的是多少,那么大家请看。
05:13
多少多少个字节,那么就是64KB 32 4g p2的六十四次方,那么用于存储不同长度的字符串,OK,好,那么下念这个length表示长度,当前字符数组的长度什么概念也记,如果我写了个字符串啊,SKABC,我直接就记下来这个字符串的长度,S tr lengths,还记不记得这长度是多少,是三?好处是什么?我这直接记下这个长度,它的结构就直接给你带着了,写进去,不用像以前C语言的这个字符,我每次要调用这个方法。
06:03
我就要遍历一次字符串的长度,没有啦,你存进去的时候我就给你记好,那么这样是不是我们的时间复杂度100%就是OE,因为我天生自带着这么一个长度,这个字符串的长度就不用从OE变成OA,每次调用调像以前的C字符数组量变离一次,这是第一点,第二个location用来计算。释放还是申请,也就有点缩容还是扩容字符已经分配的无谓使用的这个空间,OK,那AOC大家请看当前字符数组总共分配的内存大小,非常灵活方便紧凑型的来给你进行分配,那么这样我就可以引入预分配的空间算法,不用去讨论内存分配的问题,尽量避免内存碎片,达到内存分布的检测更加的高效。
07:01
这是第二个功能,第三,那么flag就这表示你这个类型用的是86 32 64等等等等,那么八法就是字符串数组,真实存取数据就放到这儿,那么当然它的长度有我们的分配的内存空间大小所来控制,所以搁到这儿了,以后请同学们注意,常用的就是八十六三二六四,那杨哥还有这个五呢,别忘了我这儿呢,都已经全部给弟兄们抓图了,避免来回源码和脑图切换,请看这么一句话,记他SS5这个is never used。我们仅仅是用它反问标志字节的一种测试,所以请看,一般这个五是不会被使用的,OK,请看这个五什么鬼,Flex buffer根本就没有前面的长度和AOC,哎,它只是内部用来做一个测试哦,真真正正用的最多的还是下面的86 32 64,为什么符合是不是二的N次方是最利于内存申请扩容和缩容最高效的。好,那么弟兄们,这个呢,就是我们简单动态字符串大家所要了解的一个源码,那么下面一句话。
08:29
清楚了,他就定义了这么一个SDS,啊,我也明白了,杨哥,我们写的hello word实质而言,真真正正存取的值是这个,在这个字符数组里面,本质上还是这么个东西,但是为了更加高效的分配计算长度紧凑,减少内存碎片,我们要有86、32、64,其他四组以及对应的长度和分配内存的一种参考值,由它拼装成我们的恰保存真正值的一个字符数组,构成了我们新的结构体SDS,它又由这四个参数维度所构成,是底层字符串数据的真真正正的载体,你只需要明白SDS是什么,到这一步就OK。那么接下来马上连珠炮班任的提问。
09:19
为什么已经有字符数组了,它也可以表示字符串啊,我为什么要重新设计一个SDS啊?刚才是是什么,现在就要回答为什么。接下来我们就要讨论一下了解了,SDS是什么,长什么样?五,86,三二,64,注意这个五,Never used OK,那么接下来我们来分析,对于我们日常使用字符串而言,是最常用的数据结构,它定义了一个type DeFine SDS简单动态字符串,分别是86、三二,64,二的多少多少次方,最利于内存申请和分配的第二个真真正正存东西的是这个字符数组,八分这么一个,那么它为什么要多出来上面这三个呢?有什么好处呢?那么接下来我们一探究竟,说一下底层的原理,为什么要重新折腾一番?来,同学们开工。
10:25
C语言当中的字符串展示,假设这是ready,这有个右杠,一个零,这个代表结尾终止符。下面我们来看一下,在C语言里面没有Java里面的就类型,基本上它只能靠自己的恰数组来实现,类似于这样,那么字符串法在C语言的存储过程当中,你要想获得这个长度。我们前面强调过这个。如果你没有SDS啊,直接是使用这么一个恰速度,我每调用一次啊,这个是不是叫便利一次啊,时间复杂度是不是on,所以折腾到这了以后,我们就会明白它需要呢,从头开始变列,直到你遇到这个终止符为止。
11:16
那么这样的话呢,就会带来一个小问题。如果这个中止符或者一个字符串里面,它不是在最后,它刚好就在中间,那么这个就容易产生歧义,本来red是五个,你中间加到这有一个右杠0C一来变列啊,明白了走人,那么这样的话是不是容易产生很多的误读和误差?所以red没有直接使用C语言传统的字符串标识,而是自己构建了一种名为。简单动态字符串SDS的抽象类型,并且将SDS作为默认字符串,好,那么接下来我们呢?都晓得了,就这几个,那么接下来我们呢,就来看看它们各自的好处和对应的比较。首先。
12:11
都清楚,Right就是C语言,这个我相信大家没有任何问题。C语言的心。开宗立派出一个SDS,理由如下。第一个字符串的长度处理好,同学们请看,对于C语言,它需要从头变列,直接遇到右杠零为止,时间复杂度on,但是SDS呢,弟兄们都清楚啊。我们这是不是天生骄傲?一出娘胎,你分配给我字符串,我就会便利一次,且给你写死,你每次修改我都写进去。那么我在使用的过程当中,我直接就记录了当前字符串的长度,可以直接读取时间,复杂度是O1,这是第一个优势。第二个内存的重新分配,对于我们Java程序而言,由Java虚拟机给我们屏蔽了,内存的管理啊,对象的创建啊,回收啊,反正交给虚拟机就行了,但是C程序啊,需要内存的申请、示范、分配,他要程序啊,人工去计算,这样的话特别容易报内存溢出。
13:17
所以对我们的C语言而言,大家请看内存分配空间超过以后会导致数组下边越界或者内存的分配溢出,这样的话C是写了red,如果red带着这样的隐患,是不是容易经常就崩了?要搞清楚啊,Red底子是个什么?内存数据库,如果内存数据库天天给你报,内存一出了,数主下标越界了,你告诉我好使吗?所以稳定压倒一切,基于此,安特雷斯呢,天才级的思维方式啊,直接给你加了AOC内存分配的预管理在SDS这他干这么一活,首先SDS修改之后,棱的长度如果小于一兆,那么将会额外的分配与棱长度相同的没使用的空间扩容,类似于如果修改后大于一兆,那么将分配一兆的使用空间,这样的话空间预分配。
14:17
连续性好,且不容易产生内内存碎片。第二个有空间分配,对应就要有空间的释放,因为C强调内存的申请释放,有点类似于我们JDBC的connection获得连接,你用完了以后一定要在final里close关闭释放连接,那么SS缩短时并不会回收多余的内存空间,而是使用福瑞字段将多出来的空间记下来,后续如果有变更操作,直接使用福瑞记录的空间,减少了内存分配,那么这样就是不会什么东西都是从零开始啊,有点类似于是上次遗留下来的还有点富裕,哎,这次的话你可以直接使用,那么这样的话惰性空间释放是不是就非常的便捷和操作安全。
15:03
好,这是它的第二个,内存分配上就要比C更加的精巧和紧凑,不容易爆校标越界和内存溢出分配。第三一个二进制的数据,它牵扯到一个二进制安全,那么它呢,对于二进制啊,它并不是规则的字符串,可能会包含一些特殊字符,比如说我们现在这就好说,我现在假设这个字符串里面我就要写个右杠零,它不是中止符,它也是这个字符串内容的一部分,那么这个时候我从左边变了一读,我去遇到第一个还是第二个,还是第三个。算结尾呢,所以这个就说不清,所以说它会可能包含一些特殊字符串,比如就又杠零,那么前面提到过啊。它会碰到零就结束,那么零之后的数据是不是读取不上来了,对吧?那么这个时候呢,我们呢就会明白,这有个Les直接告诉你这个字符串abcd长度是四,你就要变离四步就行了,我们直接根据长度来判断,那么二进制的安全问题就获得了更好的解决和加强,所以这个就是register为什么要重新设计一个SDS来取代资源的字符数组作为字符串。
我来说两句