1、简单动态字符串
redis没有直接用C语言传统的字符串(以空字符结尾的字符数组)表示,而是自己构建了一种名为简单动态字符串(SDS)的抽象类型,并将SDS用作redis的默认字符串表示。
在redis里面,C字符串只会作为字符串字面量用在一些无需对字符串值修改的地方,比如打印日志:
redisLog(REDIS_WAINING,"Rdeis is now ready to exit,bye bye...")
当redis需要的不仅仅是一个字符串字面量,而是一个可以被修改的字符串值时,redis就会用SDS来表示字符串值,比如在redis数据库里面,包含字符串值的键值对在底层都是由SDS实现的
1.1,SDS的定义
每个sds.h/sdshdr结构表示一个SDS值:
struct sdshdr {
//记录buf数组中已使用的字节的数量
//等于SDS所保存的字符串长度
int len;
//记录buf数组中未使用字节数量
int free;
//字节数组,用于保存字符串
char buf[];
}
- free 属性的值为0,表示这个SDS没有分配任何可使用的空间
- len 属性的值为5,表示这个SDS保存了一个五字节长的字符串
- buf 属性是一个char类型的数组,数组的前五个字符分别保存了’r’,‘e’,‘d’,‘i’,'s’五个字符,而最后一个字节则保存了空字符。
1.2、SDS与C字符串的区别
C语言使用长度为N+1的字符数组来表示长度为N的字符串,并且