redis数据结构--简单动态字符串

nber1994

All
Posts
Categories
Tags
About

redis数据结构--简单动态字符串

    ❐redis


redis自己构建了简单的字符串结构,c语言的字符串类型只用于一些字面量展示
SDS还被用于缓冲区,AOF模块的缓冲区就是SDS实现的

struct sdshdr {
    //记录buf已经使用的长度
    int len;
    //记录buf数组未使用的字节数量
    int free;
    //字节数组,用于保存字符串
    char buf[];
}

SDS通用遵循着\0结尾的方式,但是不会计入len,这样做的好处是可以使用部分C语言字符串函数

与c字符串的区别

常数复杂度的获取字符串长度

杜绝缓冲区溢出

减少修改字符串带来的内存重新分配次数

c字符串存在的缺点:

- 字符串拼接,如果不通过内存重分配扩展足够的空间,则会产生缓冲区溢出
- 字符串截断,如果不使用内存重新分配来释放字符串不用的空间的话,则会造成内存泄漏

对于c语言来说,偶尔的进行内存重新分配,其实是可以接受的,但是对于redis这种需要频繁修改的场景来说,内存重分配会占用一大部分时间,造成性能的降低

SDS的解决方案:

二级制安全

兼容部分C字符串函数