Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(Simple Dynamic String,SDS)的抽象模型,并将SDS用作Redis的默认字符串表示, 在Redis中,C字符串只会作为字符串字面量用在一些无需对字符串值进行修改的地方。当Redis需要的是一个可以被修改的字符串值时,Redis就会使用SDS来表示字符串值,比如在Redis的数据库中,包含字符串的键值对在底层都是由SDS实现的。SDS还被用来做缓冲区(buffer):AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区。
1、SDS的定义
每个sds.h/sdshdr
(sds.h
中的sdshdr
结构)表示一个SDS值:
struct sdshdr{
//记录buf数组中已经使用字节的数量
//等于SDS所保存字符串的长度
int len;
//记录buf数组中未使用字节的数量
int free;
//字节数组,用于保存字符串
char buf[];
};
结构示意图:
分析:
free
属性值为0,表示这个SDS没有多余的空间len
属性为5,表示这个SDS保存了一个5字节长的字符串buf
属性为一个字符数组,前面五个保存字符串中的字符,最后一个保存空字符’\0’,空字符不算进len中 </