引子
redis是由c语言实现的,但是redis中的字符串并没有直接使用c语言中的字符串,因为c语言字符串存在以下问题:
- 获取字符串长度的需要通过运算
- 非二进制安全
- 不可修改
因此,Redis构建了一种新的字符串结构,称为简单动态字符串 (Simple Dynamic String),简称SDS。
结构
SDS为结构体,其中有4个参数:
- len:buf已保存的字符串字节数,不包含结束标示
- alloc:buf申请的总的字节数,不包含结束标示
- flags:不同SDS的头类型,用来控制SDS的头大小
- buf[]:实际存放数据的数组
动态扩容
SDS之所以叫做动态字符串,是因为它具备动态扩容的能力(在存放了某个字符串后,可以在后面追加字符串)
- 如果新字符串(原字符串+追加的字符串)小于1M,则新空间为扩展后字符串长度的两倍+1;
- 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1。
称为内存预分配。
优点
- 获取字符串长度的时间复杂度为O(1)
- 支持动态扩容
- 减少内存分配次数
- 二进制安全