redis3.2之前版本的 sdshdr 结构是用4字节的无符号int存储字符串长度,此时因为长度限制,最大只能存储512M的字符串。
struct sdshdr {
int len;
int free;
char buf[];
};
redis3.2版本新增了 sdshdr64 结构,采用8字节无符号 uint64_t 来存储字符串长度,理论上该值完全可以突破512M了。
struct __attribute__ ((__packed__)) sdshdr64 {
uint64_t len;
uint64_t alloc;
unsigned char flags;
char buf[];
};
所以,sdshdr64类型,存储字符串的理论长度可以突破512M吗?
若不能,那什么情况下会用到 sdshdr64 结构呢?
是的,就是为了支持更长的字符串所以才有了
sdshdr64
。而且为了节省空间也不是都一股脑全用sdshdr64
存,而是根据字符串长度来决定用sdshdr8
、sdshdr16
、sdshdr32
还是sdshdr64
。