SDS(Simple Dynamic String)简单动态字符串。算法
Redis除了字面量用的C语言的字符串变量,其他都是使用的SDS。数组
sds.h/sdshdr源码:安全
struct sdshdr { //长度,为字符数组长度-1 int len; //分配待用的数组长度 int free; //字节数组,为了共用C语言的一些处理字符串的函数还在字符后加'\0' char buf[]; }
对比C语言字符串的优点:函数
常数复杂度获取字符串长度code
C字符串要得到长度须要遍历整个字符串数组,复杂度O(N),而SDS结构中的len能够直接获取当前字符串长度,复杂度O(1)。内存
杜绝缓冲区溢出字符串
C字符串当须要拼接字符串,若是不从新分配内存,拼接后可能会覆盖连续内存的值形成缓冲区溢出,而SDS经过free记录的安全已分配空闲空间的数组长度,若是要拼接的字符串长度大于free,会先从新奉陪空间再凭借。源码
分配规则以下:class
减小修改字符串长度时须要的内存重分配次数变量
C字符串每次修改都须要执行重分配内存,如拼接以前不执行重分配内存会产生缓冲区溢出,缩短字符串以前不自信重分配内存会产生内存泄漏。而内存重分配涉及算法浮渣,且可能须要执行系统调用,因此一般比较耗时,因此若是直接使用C语言做为Redis字符串结构显然不理想。
而SDS的free空间减小了内存重分配次数。
二进制安全
SDS使用char数组存储二进制数据,因此二进制安全。
兼容部分C字符串函数
SDS数组会在数据的后面加一个'\0'表示字符串的结束,'/0'用户不感知,也不会反应在len长度中,这样作是为了与C字符串保持统一,兼容部分C字符串函数。