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也有使用.
真正的深思熟虑的代码,套用一句常用语:学习了.
?