redis

简单动态字符串(SDS)

1
2
3
4
5
6
struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len; // 字符串长度
uint8_t alloc; // 不包括头部长度和结束符长度
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
}

不包括头的意思是:redis在新建完sds,并不会直接返回这个结构体,而是返回buf的地址,这样就可以直接使用string.h里面的方法进行处理,所以下面:

1
#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))

这个就是输入T(是sdshdrT),s就是字符串的首地址,这样处理就可以通过字符串的首地址获得整个结构体

ziplist

结构为:

1
2
3
4
5

+-------+----------------------------
|4 byte |4 byte |2 byte |
+-------+
|zlbytes|zltail |entries|