redis数据结构与对象-简单动态字符串

106 阅读1分钟

简单动态字符串

sds的定义

  • 数据结构
struct sdshdr {
    int len;
    int free;
    char buf[];
};

  • 属性介绍

    • len
    • free
    • buf

len:保存字符串长度 free:数组中未使用字符串的数量 buf:字节数组保存字符串

sds 与 c字符串区别

  • 常数复杂度获取字符串长度,因为sds纪录了字符串的长度
  • 杜绝缓冲区溢出,sds记录了字符串长度,使用空间分配策略杜绝了缓冲区溢出
  • 减少修改字符串时候带来的内存重分配,空间分配策略使用了预分配和惰性空间释放
  • 二进制安全,可以保存图片音频等二进制数据,不是空字符串表示字符串是否已经结束
  • 兼容部分c字符串,这样可以重用string.sh库定义函数

内存分配策略

  • 内存预分配

小于1m分配len属性和free属性相同的空间,len*2+1 额外1字节用于保存空字符串 大于1m分配free1m空间,len+1m+1,额外1字节用于保存空字符串

  • 惰性空间释放 缩短时候放入free未使用空间中,方便后续增长操作,不需要时候可以调用删除api释放未使用空间