sds(简单动态字符串)
定义结构:
字节长度属性len
空闲未用的字节长度free
存放数据的字节数组buf[]
注意:sds遵循了C语言中以空字符串的结尾的惯例,为的是复用一些C的字符串处理函数,实际上sds的结尾判断是利用len属性,这样sds就可以存储一些以空格分隔开的字符串。
与C的对比区别:
- 常数时间求取字符串长度,通过len属性直接得到
- 杜绝缓冲区的溢出,通过free属性事先判断能否直接拼接,不能就分配空间
- 减少字符串修改带来的内存重分配次数,通过空间预分配策略,惰性空间释放策略
- 二进制安全,字符不需要满足编码,因为保存的就是二进制数据
- 可以兼容一部分C字符串的函数
空间预分配策略:
如果修改后的字符串长度小于1MB,那么会多分配len长度的空闲字节,修改后如果是13字节,那么实际上会分配13+13+1=27字节
惰性空间释放策略:
如果修改后的字符串长度大于等于1MB,那么会多分配1MB长度的空闲未使用空间
使用场景:
redis只会使用C字符串作为字面量,例如打印日志,不被修改的场景下
sds可以作为字符串对象的一种实现,还可以作为缓冲区(因为本身就是保存的二进制字节流):AOF缓冲区,客户端中的输入缓冲区。