首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Redis string的小札记

2012-10-26 
Redis string的小笔记数据结构定义:struct sdshdr {??? long len??? long free??? char buf[]}1) buf

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

?

热点排行