redis数据结构--SDS

redis底层存储字符串的数据结构叫做简单动态字符串(simple dynamic string)。

SDS定义

下面是SDS的简单定义:

struct sdshdr {
  int len; // 记录buf已使用的字符串长度
  int free; // 记录buf未使用的字符串长度
  char buf[]; // 字节数在
}

相比于原生的C语言中的字符串,SDS具备以下优点:

  • O(1)复杂度获取字符串长度
  • 杜绝缓冲区溢出 这是记录了free之后带来的好处
  • 减少修改字符时内存重新分配的次数 因为预留了free长度的空间,关于空间分配,有以下两种策略:
    1. 空间预分配 具体分配策略是,如果SDS长度小于1MB,则分配和len相等的free,如果SDS长度大于1MB,则free=1MB。
    2. 惰性空间释放 当buf存储内容减少的时候,并不立即释放空间,而是通过增加free的值来把空间预留下来备用。
  • 二进制安全 用len记录字符真实长度,防止因为'\0'而出现的内容提前截断
  • 兼容部分C的字符串操作函数 为buf加上'\0'结尾,直接复用部分c的字符串操作函数

你可能感兴趣的:(redis数据结构--SDS)