String
Redis没有直接使用C语言的传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型。
下面我将解释为什么Redis要自己构建SDS而不是直接用C语言的String,原因其实很简单,一切都是为了提升Redis操作的性能。
SDS的定义
这里我先给出SDS的定义,下面我会对它特有的属性进行解析,大家在看的时候可以思考以下几点,为什么需要这个属性?
这个属性有什么用?没有这个属性会怎么样?在之后的数据结构解析中,希望大家也能带着相似的问题去思考Redis的设计。
struct sdshdr {
//记录buf数组已经使用的长度
//也就是SDS字符串的长度
int len;
//记录buf数组中未使用的长度
int free;
//字节数组,用于保存字符串
char buf [] ;
}
一个简单的SDS字符串
SDS字符串相比C语言字符串的优势
SDS字符串由于它比C语言字符串多出来的几个属性,所以SDS字符串很多操作效率都比C语言字符串快得多,属于典型的空间换时间策略。
常数复杂度获取字符串长度
众所周知,C语言字符串想获取长度,就得遍历整个字符串。
下图为C语言获取字符串长度的过程