简介
redis源码虽然是C语言实现的,但是Redis没有直接采用C语言传统的字符串表示,而是构建了一种名叫简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作redis的默认字符串表示。
SDS定义
SDS定义的结构体如下:
struct sdshdr{
//记录buf数组中已使用字节的数量,等于SDS所保存字符串的长度
int len;
//记录buf数组中未使用字节的数量
int free;
//字节数组,用于保存字符串
char buf[];
};
下图展示了一个SDS示例:
- free值为0,表示这个SDS没有任何未使用的空间
- len值为5,表示这个SDS保存了一个5个字节的字符串
- buf是一个字节数组,保存字符串的值,并且遵循C语言中已空字符串结尾的惯例,最后一个字节保存空字符'\0'。
SDS与C字符串的区别
- 常数复杂度获取字符串长度:
- 杜绝缓冲区溢出
- 减少修改字符串时带来的内存重分配次数(空间预分配和惰性空间释放)
- 二进制安全
- 兼容部分C字符串函数