redis 没有使用 c语言的字符串作为底层字符串的时候,而是通过构造了一个SDS的简单动态字符串数据结构
结构
| 长度 | 空闲字节数 | 字节数组 |
|---|---|---|
| int len | int free | char buf[] |
len表示当前字符串的长度free表示ptr所指向的的底层字节数组还有多少空闲字数char[]指向一个字节数组,并且在实际的字节数后面始终加上一个\0.这样做的好处是可以复用c标准库的字符串函数.
tips
len长度不包括结尾的\0.所以实际总长度为len+free+1(\0的大小)- 虽然称为
简单动态字符串,但是实际上不仅仅是存储字符串.可以存储任何二进制数据. 此时当底层存储的是二机制数据时,使用标准的字符串函数可能会出现错误. SDS可以动态的扩展和缩减.类似于java的arraylist.- 扩展方式为当扩展后的
len小于1m的时候,扩展后,free=len.否则free=1m.例如.当len=100,free=10的时候,此时需要再append100个字节的时候,len=100+100=200,free=200.总共需要新增190个字节. 当扩展后的len大于1m时,扩展后的free始终为1m.
- 扩展方式为当扩展后的