简单动态字符串(simple dynamic string)sds 作为redis的默认字符串。而不是直接使用C语言传统的字符串。
struct sdshdr{
int len;//记录buf数组中已使用的字节数量,等于sds保存的字符的长度
int free;//记录buf中未使用的字节数量
char buf[];//保存字符串
}
与C语言中string字符串相比,sds字符串有以下优点
1.计算length:c中不记录length,要遍历数组才能得到string的长度,时间复杂度为O(n);SDS则记录了lenth,时间复杂度则为O(1)
2.缓冲区溢出:C在字符串创建时,已经分配了指定的缓冲区内存。在修改的时候,都需要手动的判断内存大小是否允许修改后的值。如果忽视了手动判断大小,直接拼接则容易造成,缓冲区内存溢出。SDS则会在修改时,会自动判断大小,从而避免了缓冲区溢出的可能。
3.减少了内存重新分配次数。sds加入了free,采用空间预分配和惰性空间释放来优化分配次数。不想java一样,String类型,放在了常量池中。free 用来记录修改后,未使用的大小。这就是为了方便,惰性空间释放。
4.二进制安全的
5.兼容部分C的函数,尾部也保留空字符
与java中String有所区别
java 中string是final的,java中string被存放在常量池中,不能修改,因为java内存由虚拟机动态内存管理。