Redis 的简单动态字符串 (simple dynamic string,SDS)
SDS的结构:
struct sdshdr {
int len; //保存的字符串长度。
int free; //buf数组中,未使用字节的数量。
char buf[]; //字节数组,用于保存字符串。
}
区别于C语言中的字符串结构:
1、C语言的字符串,以空字符'\0'为结尾标识。
2、SDS 以len为结尾标识。(每个SDS结尾都会额外的添加空字符,是为了兼容C函数。)
这样设计的好处:
1、获取字符串长度的时候,就不需要遍历buf数组,进行长度的统计。
2、杜绝缓冲区溢出。
3、减少修改字符串时带来的内存重分配次数。
扩容的机制为: 扩容后少于1m的,长度翻倍。例如字符串长度为10,则buf的长度扩容后为21(10+10+1(空字符))。
扩容后大于1m的,30M+1M+1byte
惰性释放空间:不主动缩小buf的长度。
4、二进制安全。如果存放二进制数据,空字符并不能代表字符串的结尾。但是SDS格式由于结尾表示由len决定,所以可以安全的存储二进制的数据。