sdshdr

Redis 2.8.9源码

谁都会走 提交于 2020-12-17 00:45:42
本文为作者原创,转载请注明出处: http://my.oschina.net/fuckphp/blog/269167 在C中子字符串的实现都是用 char *来实现的,用起来很不方便,而且容易出现内存泄露,并且效率不高,在Redis内部,字符串采用了 sds 的方式进行了封装,似的字符串在Redis中可以方便、高效的使用,Redis字符串的实现如要依赖一下两个数据类型和结构(以下代码可以在 src/sds.h中找到): typedef char *sds; sds 存放了字符串的具体值 struct sdshdr { int len; //字符串对象已经使用的内存数量 int free; //字符串对象剩余的内存数量 char buf[]; //字符串对象的具体值(其实就是sds字符串) }; sdshdr 实现了字符串对象 这样设计的好处有很多,比如使得Redis在获取字符串长度的时候可以达到o(1)的复杂度,在进行追加等字符串操作的时候,可以减少内存分配(提高性能),sdshdr的结构使得根据sds字符串获取对应的sds对象的时候可以非常方便的获取。 创建字符串 init 为需要初始化的字符串值。initlen表示为初始化字符串的长度,该函数创建一个sds字符串对象并返回sds字符串 (以下代码可以在 src/sds.c中找到): sds sdsnewlen(const