本节开始,我们来一起了解一下redis的原理,分为四个部分,数据结构与对象,单机数据库实现,多机数据库实现,独立功能的实现
简单动态字符串
1、redis没有直接使用c语言传统字符串标识,而是自己构建了名为简单动态字符串(simple dynamic string,sds)的抽象类型作为默认字符串标识,仅在无须修改字符串地方使用c字符串,例如日志打印 redisLog(“xxxxxxx”)
2、sds定义
free属性值为0,表示sds没有分配任何未使用空间
len属性值为5,表示sds保存了一个五字节长的字符串
buf属性是一个char类型数组,例如,前五个字节分别保存 R e d i s ,最后一个字节是空字符‘\0’,空字符1字节空间不计算在sds len属性内
3、sds与c字符串区别,c语言使用长度为n+1的字符数组来表示长度n的字符串,最后一个字节是空字符‘\0’,并不能满足redis对字符串安全性,效率以及功能的需求
3.1、常熟复杂度获取字符串长度o(1)
3.2、杜绝了缓冲区溢出,当api对sds进行修改时,api会先检查sds空间是否满足修改所需要求,不满足,自动扩容,然后才执行修改
3.3、减少修改字符串时带来的内存重分配次数,通过free属性标识未使用字节
3.3.1、空间预分配,len小于1m,free会和len相等,len大于1m,会分配free=1m,通过空间预分配策略,减少连续执行字符串增长操作所需的内存重分配次数
3.3.2、惰性空间释放,用于优化缩短字符串,执行缩短时候,程序不会立即使用内存重新分配回收缩短后多出来的字节,而是使用free属性将这些字节数量记录起来,并等待将来使用,sds也提供相应api,真正释放sds的未使用空间,所以不必担心造成内存浪费
3.3.3、二进制安全,c字符串除了末尾字符串之外,中间也不能包含空字符串,否则会被认为是末尾,sds不会对数据做任何限制,过滤或者假设,原因,Redis不是用数组来保存字符,而是用它保存二进制数据
3.3.4、兼容部分c字符串
总结
楚王国
周王朝势力不断衰弱,楚国越来越强大,范围沿着长江逐渐东移,楚部落可能是苗族的一支,吃奶,叫谷
706年楚国打败随国,704年宣布建立楚王国,此时两个中央政府并存,华雄,建立楚王国后开始展示威力,最终其他国家都像觐见周王国一样觐见楚王国,确定了楚王国霸权,楚王国建立的最大一件事情=就是接受不了华夏民族的方块字,因为文字系统的统一,最终融化成为一个民族,方块字在大分裂时候再次显示其功能,在清朝入主中原后,第三次显示