简介
首先在Redis中,没有直接使用C语言传统字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型(可以简单的理解为Java中的String 类),并且将SDS用作Redis的默认字符串表示。
C语言字符串:
#include <stdio.h>
int main()
{
char c0[] = { 'c', ' ', 'p', 'r', 'o', 'g'}; //普通字符数组
printf("c0 = %s\n", c0); //没有乱码,因为编译的时候,以字符串格式输出的时候,默认在数组尾部追加了'\0'
char c1[] = { 'c', ' ', 'p', 'r', 'o', 'g' ,0}; //普通字符数组
printf("c1 = %s\n", c1); //没有乱码
//以 0 (‘\0’就是数字0)结尾的字符数组是字符串
char c2[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0' };
printf("c2 = %s\n", c2);
//字符串处理以‘\0’(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
char c3[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0' };
printf("c3 = %s\n", c3);
return 0;
}
Redis里面,C字符串只会作为字符串字面量(string literal)用在一些无需对字符串值,修改的地方,例如打印日志:
redisLog(REDIS_WARNING,"Redis is now reday to exit,bye bye . . .")
当Redis需要的不仅仅 是一个字符串字面量,而是一个可以被修改的字符串值的时候,就会采用SDS来表示字符串值,比如Redis 的数据库里面,包含字符串值得键值对在底层都是由SDS实现的。
举个例子:
如果客户端执行一个命令:
redis > SET msg "hello world"
OK
那么Redis 将在数据库中创建一个新的键值对,其中:
键值对的键 msg ,底层实现是一个保存着字符串"msg"的SDS
键值对的值,底层实现是一个保存着字符串"hello world" 的SDS
又比如,如果客户端执行命令:
redis> RPUSH fruits "apple" "banana" "cherry"
(integer) 3
那么,Redis 将在数据库中 ,创建一个新的键值对,其中:
1、键值对的键 是一个字符串对象,对象的底层保存着一个字符串"fruits “的SDS。
2、键值对的值,是一个列表对象,列表对象中包含了3个字符串对象,这3个字符串对象分别由3个SDS实现: 分别保存着"apple” 、“banana” 、“cherry” 字符串对象。
SDS除了用来保存数据库中的字符串值以外,SDS还被用作缓冲区:AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区,都是由SDS实现的,我会在别的章节中介绍AOF持久化和客户端状态的时候,可以看到SDS在这2个模块中的应用。
下面将会对SDS的实现进行介绍,说明SDS和C字符串的不同之处,解释为什么Redis要使用SDS而不是C字符串,并且在最后给出SDS的操作api
SDS实现介绍:
链接: 2.1 SDS的定义
链接: 2.2 SDS 与C字符串的区别
链接: 2.3 SDS的API