简介
首先在Redis中,没有直接使用C语言传统字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型(可以简单的理解为Java中的String 类),并且将SDS用作Redis的默认字符串表示。
C语言字符串:
#include<stdio.h>intmain(){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);return0;}
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
版权归原作者 Code攻城狮 所有, 如有侵权,请联系我们删除。