redis没有使用C语言的传统以空字符结尾的字符数组,而是自己构建了simple dynamic string SDS
类型。
C字符串只会用在一些无需对字符串值修改的地方比如打印日志。
2.1 SDS的定义
2.2 SDS 与 C字符串的区别。
1、C字符串最后一个元素总是‘\0’
2.2.1 常数复杂度获取字符串长度
有len位
2.2.1 杜绝缓冲区溢出
由于没有记录未使用空间以及长度,当拼接字符串的时候容易造成缓冲区的溢出。
2.2.3 减少修改字符串时带来的内存重分配次数
在C语言串中append或者trim操作都会为字符串重新分配内存,但是sds实现了预分配
和惰性空间
两种优化策略。
1、对sds操作之后,len小于1MB就分配同样大小的 + 1
2、超过了1MB那就将len编程30MB 分配1MB未使用空间
惰性空间释放就是:free属性记录字节的数量,冰灯将来使用,不立马重新分配回收缩短后多出来的字节。
2.2.4 二进制安全
2.2.5 兼容部分C字符串函数
2.2.6 总结
2.3 SDS API
2.4 重点回顾
1、redis会用C字符串作为字面量,大多数用sds可以常数时间获取长度、杜绝缓冲区溢出、减少修改字符串长度所需的内存重分配次数、二进制安全、兼容部分C字符串函数。