Redis 简单动态字符串

2022-09-12  本文已影响0人  wayyyy

Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种命名简单动态字符串的抽象类型。并将SDS作为Redis默认的字符串表示。

SDS实现

struct sdshdr
{
    int len;        // buf中已经占用的长度
    int free;       // buf中剩余可用空间的长度
    char buf[];     // buf
};
image.png

SDS 遵循C字符串结尾的惯例'\0'


typedef char *sds;
sdsnewlen 函数实现
sds sdsnewlen(const void *init, size_t initlen)
{
    if (init)
        sh = zmalloc(sizeof(struct sdshdr) + initlen + 1);   // zmalloc 不初始化所分配的内存
    else
        sh = zcalloc(sizeof(struct sdshdr) + initlen + 1);   // zcalloc 将分配的内存全部初始化为 0

    // 内存分配失败,返回
    if (sh == NULL)
        return NULL;
  
    sh->len = initlen;   // 设置初始化长度     
    sh->free = 0;  // 新 sds 不预留任何空间
    // 如果有指定初始化内容,将它们复制到   sdshdr 的 buf 中 T = O(N)
    if (initlen && init)
        memcpy(sh->buf, init, initlen);      
      sh->buf[initlen] = '\0';  // 以 \0 结尾
  
    // 返回 buf 部分,而不是整个 sdshdr
    return (char *)sh->buf;
}
sdsnewlen.png
sdsMakeRoomFor 函数实现
SDS相比于C字符串优势

性能测试

上一篇 下一篇

猜你喜欢

热点阅读