redis底层存储字符串的数据结构叫做简单动态字符串(simple dynamic string)。
SDS定义
下面是SDS的简单定义:
struct sdshdr {
int len; // 记录buf已使用的字符串长度
int free; // 记录buf未使用的字符串长度
char buf[]; // 字节数在
}
相比于原生的C语言中的字符串,SDS具备以下优点:
- O(1)复杂度获取字符串长度
- 杜绝缓冲区溢出 这是记录了free之后带来的好处
- 减少修改字符时内存重新分配的次数 因为预留了free长度的空间,关于空间分配,有以下两种策略:
- 空间预分配 具体分配策略是,如果SDS长度小于1MB,则分配和len相等的free,如果SDS长度大于1MB,则free=1MB。
- 惰性空间释放 当buf存储内容减少的时候,并不立即释放空间,而是通过增加free的值来把空间预留下来备用。
- 二进制安全 用len记录字符真实长度,防止因为'\0'而出现的内容提前截断
- 兼容部分C的字符串操作函数 为buf加上'\0'结尾,直接复用部分c的字符串操作函数
网友评论