Redis string的小笔记

数据结构定义:

struct sdshdr {
    long len;
    long free;
    char buf[];
};
1) buf是一个变长数组,指向真正的字符串,非指针*;
2) len存储字符串总长度,保证o(1)的长度获取操作;
3) free存储空闲字符长度.
简短精悍.

新建一个字符串:
sds sdsnewlen(const void *init, size_t initlen) {
    struct sdshdr *sh;

    sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
#ifdef SDS_ABORT_ON_OOM
    if (sh == NULL) sdsOomAbort();
#else
    if (sh == NULL) return NULL;
#endif

    len = initlen;
    free = 0;
    if (initlen) {
        if (init) memcpy(buf, init, initlen);
        else memset(buf,0,initlen);
    }
    buf[initlen] = '\0';
    return (char*)buf;
}

由字符串获取原数据结构并访问:
size_t sdslen(const sds s) {
    struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
    return len;
}
这种trick在是否新建redisObject时是否使用VM也有使用.
真正的深思熟虑的代码,套用一句常用语:学习了.

 

你可能感兴趣的:(String)