Redis读书笔记一:简单动态字符串

简单动态字符串 结构

1
2
3
4
5
6
7
8
struct sdshdr {
// 记录已使用字节的数量
long len;
// 记录未使用的字节数量
long free;
// 保存字符串
char buf[];
};

buf以'\0'为作为字符串结束符,为了能使用C语言本身的库

SDS设计对比C语言字符串的优势:

  • 获取字符串长度的时间复杂度 O(1)
  • 避免缓冲区溢出情况
    • 在拼接扩展字符串时,先检测free是否有足够的容量加载新字符,无则新分配内存
  • 减少修改字符串带来的内存重新分配次数:
    1. 空间预分配:在做空间扩展时,不仅会分配必须的内存大小,还会额外分配未使用空间。额外分配规则:
      • 如果分配后,sds->len大小小于1M,将分配额外空间大小为sds->len。例如:修改后len大小为13,则会分配free=13,最终buf的字节长度为 13(len)+13(fee)+1('\0') = 27;
      • 如果分配后,sds->len大小 大于 1M,将分配额外空间大小为1M。例如,修改后len大小为30M,则会分配free=1M,最终buf的字节长度为 30M + 1M +1byte
      1. 惰性空间释放
      • 避免内存重新分配
      • 为将来可能有的增长操作提供了优化
  • 二进制安全
    1. 在C语言中,如果存在'\0',则会终止取值。二进制的内容可能存在该字符,所以在C语言中是不安全的,但sds是根据len取值
    2. 兼容部分 C 字符串函数。

本文标题:Redis读书笔记一:简单动态字符串

文章作者:Craze lee

发布时间:2019年02月23日 - 10:02

最后更新:2019年02月23日 - 12:02

原始链接:http://craze-lee.github.io/2019/02/23/Redis/简单动态字符串/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

您的支持将鼓励我继续创作!