Redis中,包含字符串值的键值对在底层都是由SDS实现的
redis > SET msg "hello world"
- 键值对的键是一个字符串对象,对象的底层实现是一个保存字符串“msg”的SDS。
- 键值对的值也是一个字符串对象,同上。
redis > RPUSH fruits "apple" "banana" "cherry"
- 键值对的键是一个字符串对象,对象的底层实现是一个保存字符串“fruits ”的SDS。
- 键值对的值也是一个列表对象,列表对象包含了三个字符串对象。这三个对象分别由三个SDS实现。
struct sdshdr {
//记录buf数组中已使用字节的数量
//等于SDS所保存字符串的长度
unsigned int len;
//记录buf数组中未使用字节的数量
unsigned int free;
//用于保存字符串
char buf[];
常数复杂度获取字符串长度
c字符串获取其本身长度的时间复杂度为O(n),SDS能够常数复杂度获取字符串长度
杜绝缓冲区溢出
当SDS API需要对SDS进行修改时,API会先检查SDS的空间是否满足修改所需的空间
减少修改字符串时带来的内存重分配次数
空间预分配法
当SDS的API对一个SDS进行修改,并对SDS进行空间扩展的时候,程序不仅会为SDS分配修改所必须的空间,还为SDS分配额外的未使用空间。
惰性空间释放法
当SDS的API需要缩短SDS保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出的字节,而是用free将之记录下来。
SDS使用len属性的值而不是空字符串来判断字符串是否结束