一、Redis 为什么自定义字符串实现?
SDS(Simple Dynamic String简单动态字符串),redis没有直接使用C语言的字符串,而是自己定义了一个结构体来实现字符串的功能。
1、在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。没有类似length属性来表示字符串的长度。每次要求字符串长度都需要遍历字符串直到\0才能知道长度,复杂度为O(n),十分浪费CPU。且无法保存\0这种特殊字符。
2、扩缩容,C字符串中的字符串扩容是需要重新申请新的内存,然后将原字符串和要扩的字符串拼接起来存储到新内存中,然后销毁掉老内存。redis中是会多申请一部分的内存,后面拼接的时候就不需要额外申请内存了。缩容也是一样,C字符串要直接拷贝原始的内存的值,redis通过修改len属性来实现。
sds结构体:
struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len; // 下面的buf数组已经使用了多少字节
uint8_t alloc; // 下面的buf数组实际分片
unsigned char flags; // 低三位用来表示字符串的类型
char buf[]; // 用来存储字符串数据
};
参考:https://juejin.cn/book/7144917657089736743/section/7147528939244617763
11万+

被折叠的 条评论
为什么被折叠?



