Redis——简单动态字符串SDS

简单动态字符串(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内存由虚拟机动态内存管理。

 

 

你可能感兴趣的:(Redis)