SDS(simple dynamic string)简单动态字符串
SDS与C语言字符串在redis用法上的区别:
C语言字符串用于字符串不被修改的地方,如日志输出
SDS是一个可以被修改的字符串,如键,值
结构体保存在sds.h/sdsdr文件中
struct sdhdr{
//记录buf数组中已经使用的字节的数量
int len;
//记录buf数组中未使用的数量
int free;
//字节数组用于保存字符串
char buf[];
};
注意C语言字符串的最后一个空字符‘\0’不属于len
打印字符串时用
printf("%s",s->buf);
SDS与C语言字符串的区别
1.常数复杂度获取自妇产长度
C语言求长度是需要遍历的
2.杜绝缓冲区溢出
C语言有一个函数
char *strcat(char*dest,const char*src);
用于把src字符串拼接到dest上面,但是如果dest空间不足就会产生溢出。
Redis有自己的SDS拼接函数sdscat用于拼接,会先检查是否有足够大的内存空间,不够就进行内存拓展,然后再进行拼接。
3.减少修改字符串带来的内存分配次数
C语言不用说,每次都是重新分配,但是SDS不一样,实现了:
- 空间预分配
- 若对SDS修改之后,长度小于1MB,则分配 len+free+1长度的空间
- 若大于小于1MB,则会分配len+1MB+1byte的空间
- 惰性空间释放
如sdstrim(s,“xy”)会删除s中xy字母,那么可能会多出一定的空间,redis并不进行释放,而是留着以免后面的使用
3.二进制安全
C语言字符串以空字符结尾,比如当读入字符串的时候,遇到空格就会结束,但是SDS是以len的长度来判断结束的,而且C语言字符串不能保存音,视频等文件,但是SDS保存的是二进制数据。
来源:CSDN
作者:cirol1997
链接:https://blog.csdn.net/cirol1997/article/details/104198268