本文只解析SDS与C字符串区别,建议搭配相关实现源码阅读,关于SDS源码实现,可以参考笔者之前的文章Redis 5.0数据结构之SDS简单动态字符串实现源码详解
SDS概述
Redis基于C语言实现,但Redis并没有采用C语言中传统的字符串表示,而是特别构建了一种叫做简单动态字符串(simple dynamic string)的数据结构,简称SDS,SDS是Redis中默认的字符串表示。
C字符串只在无须对字符串值修改的场景下作为字面量使用,如日志打印,而在字符串值可能被修改的场景下,均使用SDS表示字符串值。
SDS与C字符串异同
相同点
C字符串底层本质就是一个char类型数组,SDS就是在该数组的基础上额外定义了几个属性和一系列实现策略,在字符串存储本质上与C字符串相同,都是使用一个字符数组存储。
此外,在设计时为了减少代码冗余,SDS与C字符串一样保存了字符数组最后一位为空字符’\0’,这样可以重用string.h中的部分函数。
区别
数据结构
前文提及,SDS在用于存放字符串的字符数组buf[]基础上增加了几个额外的属性存储信息,这些属性主要用于保存buf[]数组相关的长度,SDS的设计以极少量的空间代价换来了许多好处(见下文)。
在Redis 3.2以前的版本,增加的属性是unsigned int型的len和free属性,len用来记录buf[]数组中已使用的长度,free用来记录buf[]数组未被使用的长度。
Redis 3.2以前SDS的数据结构源码如下:
struct sdshdr {
unsigned int len; //表示buf[]数组中已使用的长度
unsigned int free;