Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),
而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,
并将SDS用作Redis的默认字符串表示。
在Redis里面,C字符串只会作为字符串字面量(string literal)用在一些无须对字符串值进行修改的地方,
比如打印日志:redisLog(REDIS_WARNING,"Redis is now ready to exit, bye bye...");当Redis需要的不仅仅是一个字符串字面量,
而是一个可以被修改的字符串值时,Redis就会使用SDS来表示字符串值,
比如在Redis的数据库里面,包含字符串值的键值对在底层都是由SDS实现的。
举个例子,如果客户端执行命令:redis> SET msg "hello world"
OK
那么Redis将在数据库中创建一个新的键值对,其中:
·键值对的键是一个字符串对象,
对象的底层实现是一个保存着字符串“msg”的SDS。
·键值对的值也是一个字符串对象,
对象的底层实现是一个保存着字符串“hello world”的SDS。
又比如,如果客户端执行命令:redis> RPUSH fruits "apple" "banana" "cherry"
(integer) 3
那么Redis将在数据库中创建一个新的键值对,其中:
·键值对的键是一个字符串对象,对象的底层实现是一个保存了字符串“fruits”的SDS。
·键值对的值是一个列表对象,列表对象包含了三个字符串对象,
这三个字符串对象分别由三个SDS实现:第一个SDS保存着字符串“apple”,
第二个SDS保存着字符串“banana”,第三个SDS保存着字符串“cherry”。
除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区(buffer):
AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区,都是由SDS实现的,
在之后介绍AOF持久化和客户端状态的时候,我们会看到SDS在这两个模块中的应用。