Redis没有直接使用C字符串(以’\0’结尾的字符数组),而是构建了一种名为简单动态字符串( simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。在Redis里面,C字符串只会作常量值,比如打印日志:
redisLog(REDIS_WARNING,"Fatal: Can't initialize Background Jobs.");
当Redis需要一个可被修改的字符串时,就会使用SDS来表示字符串值,在Redis中,包含字符串值的键值对在底层都是由SDS实现的。比如执行下面的命令:
redis> rpush fruits "apple" "banana" "cherry"
(integer) 3
Redis将在数据库中创建一个新的key-value对,其中:
key是一个字符串对象,对象的底层实现是一个保存了字符串”fruits”的SDS;
value是一个列表对象,列表对象包含了三个字符串对象,这三个字符串对象分别由三个SDS实现:第一个SDS保存着字符申”apple”,第二个SD5保存着字符串”banana”,第三个SDS保存着字符串”cherry”。
除了用来保存字符串之外,SDS还被用作缓冲区:AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区,都是由SD5实现的。
1:SDS的定义
在sds.h中,定义了结构体sdshdr表示SDS,其定义如下:
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
len记录buf中已使用的字节数量,也就是SDS保存的字符串的长度(不包括末尾的’\0’);free记录buf中未使用的字节数量(也不包括’\0’);buf是字节数组,用于保存字符串。比如下面的例子: