第2章:简单动态字符串
Redis用作键值对或AOF缓冲区的字符串为SDS(简单动态字符串),而不是C语言传统字符串(只用作打印log等不会修改字符串值的地方)。
2.1 SDS的定义
{//SDS字符串长度(buf数组中已使用的空间)int len;//buf数组中未使用的空间int free;//字节数组,用于保存字符串char buf[];
}
2.2 SDS与C字符串的区别
2.2.1 常数复杂度获取字符串长度
C语言的传统字符串相当于SDS中的buf[],获取字符串长度时的时间复杂度为O(n),而SDS显然为O(1)。
2.2.2 杜绝缓冲区溢出
在修改字符串等操作时,会先判断是否会溢出,即原本的buf[]空间是否足够,若不够,会先对buf[]进行扩展。
2.2.3 减少修改字符串时带来的内存重分配次数
1>空间预分配
SDS扩展时,小于1MB,会分配与len同样的未使用空间,大于1MB时,分配1MB未使用空间。
2>惰性空间释放
在移除SDS中部分字符串时,不马上回收空间,而是使用free记录,在真正需要释放空间时调用方法释放空间。
2.2.4 二进制安全
C字符串以’\0’结尾,二进制或带有’\0’的字符串会识别错误。
SDS以len记录字符串数据,不会错误识别原字符串汇总的’\0’。
2.2.5 兼容部分C字符串函数
SDS中的buf[]在保存文本数据时,相当于C字符串。
SDS API
略,原书P17。