Redis没有使用C中默认的字符串(字符数组),而是自己构建了一个简单动态字符串(SDS)的抽象类型,并且作为默认的字符串。
sds.h/sdshdr
结构体表示一个SDS值:
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
相比普通的C字符串,SDS的优点在于:
在使用SDS API进行字符串修改需要扩容时,不仅会分配修改所必须的空间,而且还会分配额外的未使用空间。总体策略:
通过空间预分配,可以减少内存分配次数。
释放策略是:弹药使用API缩短SDS字符串时,程序并不会回收多出来的字节,而是使用free字段记录下来,以等待将来被使用。
通过惰性空间释放,可以减少内存回收的次数,未回收的内存可以继续用于字符串的存储。
如果要回收内存,SDS提供了相应的API。
虽然SDS的buf保存了C的\0
结尾的约定,但是它实际内容其实是由len字段决定,因此存储音视频等二进制数据是没有问题的,不用对数进行任何过滤操作。
SDS也因此被称为字节数组--保存二进制数据。
SDS仍然遵循C字符串以空白字符结尾的惯例,因此它也能使用C字符串中<string.h>部分函数。
如stacat、strcmp等。
区别:
原文:https://www.cnblogs.com/xl2432/p/12719315.html