Redis SDS

SDS(Simple Dynamic String)简单动态字符串。算法

Redis除了字面量用的C语言的字符串变量,其他都是使用的SDS。数组

sds.h/sdshdr源码:安全

struct sdshdr {

  //长度,为字符数组长度-1
  int len;

  //分配待用的数组长度
  int free;

  //字节数组,为了共用C语言的一些处理字符串的函数还在字符后加'\0'
  char buf[];
}

 

对比C语言字符串的优点:函数

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

 

常数复杂度获取字符串长度code

C字符串要得到长度须要遍历整个字符串数组,复杂度O(N),而SDS结构中的len能够直接获取当前字符串长度,复杂度O(1)。内存

杜绝缓冲区溢出字符串

C字符串当须要拼接字符串,若是不从新分配内存,拼接后可能会覆盖连续内存的值形成缓冲区溢出,而SDS经过free记录的安全已分配空闲空间的数组长度,若是要拼接的字符串长度大于free,会先从新奉陪空间再凭借。源码

分配规则以下:class

  1. 当len长度小于1MB,再分配len大小的数组空间
  2. 当len长度大于等于1MB,再分配1MB大小数组空间

减小修改字符串长度时须要的内存重分配次数变量

C字符串每次修改都须要执行重分配内存,如拼接以前不执行重分配内存会产生缓冲区溢出,缩短字符串以前不自信重分配内存会产生内存泄漏。而内存重分配涉及算法浮渣,且可能须要执行系统调用,因此一般比较耗时,因此若是直接使用C语言做为Redis字符串结构显然不理想。

而SDS的free空间减小了内存重分配次数。

二进制安全

SDS使用char数组存储二进制数据,因此二进制安全。

兼容部分C字符串函数

SDS数组会在数据的后面加一个'\0'表示字符串的结束,'/0'用户不感知,也不会反应在len长度中,这样作是为了与C字符串保持统一,兼容部分C字符串函数。

相关文章
相关标签/搜索