Redis学习-简单动态字符串SDS

梦想与她 提交于 2020-02-06 20:24:47

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不一样,实现了:

  1. 空间预分配
    1. 若对SDS修改之后,长度小于1MB,则分配 len+free+1长度的空间
    2. 若大于小于1MB,则会分配len+1MB+1byte的空间
  2. 惰性空间释放
    如sdstrim(s,“xy”)会删除s中xy字母,那么可能会多出一定的空间,redis并不进行释放,而是留着以免后面的使用
3.二进制安全

C语言字符串以空字符结尾,比如当读入字符串的时候,遇到空格就会结束,但是SDS是以len的长度来判断结束的,而且C语言字符串不能保存音,视频等文件,但是SDS保存的是二进制数据。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!