Redis源码研究--字符串

时间:2023-03-09 02:15:45
Redis源码研究--字符串

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

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

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

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

 typedef char *sds;

 struct sdshdr {
int len;
int free;
char buf[];
};

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

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

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

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

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

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

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

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

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