您的位置:首页 > 理论基础 > 数据结构算法

[超级面试题]Q339-一文彻底解决Redis的底层数据结构

2019-04-11 18:55 295 查看

Redis有5种数据类型:字符串、哈希表、列表、集合、有序集合。这5种数据类型由8种数据结构具体实现。Redis是C语言开发的。C语言的字符串,本质是一个char字符数组,且最后一个元素是字符′\0′' \backslash 0 '′\0′,比如字符串′Hi′'Hi'′Hi′在内存是字符数组[′H′,′i′,′\0′]['H','i','\backslash 0'][′H′,′i′,′\0′]。

C语言的字符串有三个缺点:第一,字符串不保存长度信息,如果要创建一个字符串,通常是先创建一个足够大的字符数组,比如char[1024]或者char*动态分配内存存储字符串,字符数组的最后一个元素一定是′\0′'\backslash 0'′\0′,因此字符串的实际长度最大不超过1023,如果想知道字符串的长度,需要从字符数组的第一个元素开始遍历,直到遇到′\0′'\backslash 0'′\0′为止,时间复杂度为\O(n); 第二,如果对字符串进行追加操作,可能会发生字符数组长度不够的情况,需要重新构造一个更大的字符数组,然后把旧字符数组复制到新字符数组,多次内存分配影响性能; 再次,多字节字符串存储问题,比如UTF-8,考虑到不可预计的需求,字符串数组应当不对存储的字符类型做任何预设,可以存储ASCII码,可以存储多字节码,也可以存储其他格式或者用户自定义格式。

Redis的字符串类型,称之为SDS(Simple Dynamic String)类型。跟C语言字符串相比,SDS的内部有长度变量,获取字符串长度是时间复杂度是O(1)O(1)O(1),也有字符数组剩余可用长度,以方便追加字符串计算。SDS对字符串追加进行优化,如果新字符串的长度不超过字符数组长度,直接追加,如果超过,则重新分配空间,具体实现是,如果新字符串长度小于1M,那么新分配空间是新字符串长度2倍,如果新字符串长度等于或者大于1M,新分配空间是新字符串长度+1M,SDS最大长度是512M。SDS是二进制安全的,能存储任意数据类型,比如一个JPEG图像,或者一个序列化后的Java对象、Ruby对象、Python对象。

http://www.chaojimianshiti.com

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: