Redis源码研究--字符串

之前看的内容,占个位子,以后补上。

------------8月2日-------------

好久没看了,惭愧,今天抽了点时间重新看了Redis的字符串,一边写博客,一边看。

Redis的字符串主要在sds.h、sds.c文件中。打开sds.h,发现代码也不多。贴一下

1 typedef char *sds;
2 
3 struct sdshdr {
4     int len;
5     int free;
6     char buf[];
7 };

 

看到了没,sds其实就是个char* ,刚开始看到这里,觉得好失望,这不是骗国家的钱吗,往下看,发现没这么简单,还牵扯到指针操作。

sds和sdshdr数据结构是关联在一块的,可以把sdshdr里的buf看成sds,给你sds的地址,我们就能知道sdshdr的地址。头文件代码里就有

1 static inline size_t sdslen(const sds s) {
2     struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
3     return sh->len;
4 }

 

指针往前移动了两个int大小,这里有人可能会有另外一个疑惑,sizeof(struct sdshdr)怎么是两个int大小呢???

仔细看发现char buf[]都没有分配空间,其实这是c99新加的特性,貌似叫动态数组,不占存储空间。

下面那个函数inline也是c99中加的,与C++中的inline差不多。

看明白了这些,头文件里基本就没什么东西了。

然后想想,为什么Redis不用char *,而是用这个sdshdr结构体,看结构体里的东西,len 与free,没错。len是求字符串长度,len + free 是总共分配的空间。

因为char *如果要求字符串长度,需要挨个遍历,复杂度是O(n),而且一旦char * 确定了,想要追加,只能重新再分配一个。

 

posted on 2013-06-23 14:17  feiyunruyue  阅读(226)  评论(0编辑  收藏  举报

导航