redis数据结构sds

发布时间 2023-08-14 15:10:52作者: 每天提醒自己要学习

简单字符串sds

数据结构

struct sdshdr {
//
记录buf
数组中已使用字节的数量
//
等于SDS
所保存字符串的长度
int len;
//
记录buf
数组中未使用字节的数量
int free;
//
字节数组,用于保存字符串
char buf[];
};

img

特性

空间预分配

空间预分配用于优化SDS的字符串年增长操作:当SDS的API对一个SDS进行修改,并且需要对SDS进行空间扩展的时候,程序不仅会为SDS分配修改所必须要的空间,还会为SDS分配额外的未使用空间。

如果对SDS进行修改之后,SDS的长度将小于1MB,那么程序分配和len属性相同大小的未使用空间,这时SDS len属性的值将和free属性的值相同。

如果对SDS进行修改之后,SDS的长度将大于等于1MB,那么程序会分配1MB的未使用空间

惰性空间释放

惰性空间释放用于优化SDS的字符串缩短操作:当SDS的API需要缩短SDS保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而是使用free属性将这些字节的数量记录起来,并等待将来使用

优点

  1. 常数复杂度获取字符串的长度
  2. 杜绝缓冲区溢出
  3. 减少字符串长度时所需的内存冲分配次数。
  4. 二进制安全
  5. 兼容部分C字符串函数