1.概述
redis没有直接使用C语言传统的字符串,而是自己构建了一种简单动态字符串(simple dynamic string SDS),并将SDS用作Redis的默认字符串。
2.SDS定义
/*
* 保存字符串对象的结构
*/
struct sdshdr {
// buf 中已占用空间的长度
int len;
// buf 中剩余可用空间的长度
int free;
// 数据空间
char buf[];
};
3.SDS与C字符串的区别
3.1 C字符串并不记录字符串的长度,获取字符长度的复杂度为O(N),SDS获取一个SDS的长度复杂度为O(1)
3.2 C字符串不记录自身的长度带来的一个问题就是容易造成缓冲区溢出,SDS API对SDS进行修改时,API会先检查SDS的空间是否满足修改所需的需求,如果不满足,API会自动将SDS的空间拓展至执行所需的大小,然后才执行实际的操作。
3.3. C字符串在对字符串做拼接或截断操作(append/trim),程序如果没有先通过内存重分配来扩展/释放底层数组的大小,就容易出现内存溢出或内存泄露,SDS对字符串进行修改的时候,API会对空间进行预分配,减少修改字符串时所需的内存重分配次数。