Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符(SDS)串的数据结构
一 SDS 的定义
struct{
int len; // 记录buf数组中已使用的字节数量
int free; // 记录buf数组中未使用的字节数量
char buf[] ;
}
free 属性 的值为0,表示这个SDS没有分配任何未使用的空间
len 属性的值为5,表示这个SDS 保存了一个5字节长的字符串
看下图
free 属性 的值为2,表示这个SDS分配2个未使用的空间
二 SDS 与 C字符串的区别
1 获取字符串的长度
SDS 根据 len 即可获取
C 字符串 需要遍历数组 直到遇到 \0
2 杜绝缓冲区溢出
SDS 的空间分配策略完全杜绝了发生缓冲区溢出的可能性。
SDS 的空间分配策略
(1)对SDS进行修改之后,如果SDS的len小于1MB,那么程序分配和len 属性同样大小的未使用空间
例如 len = 13,SDS的buf数组实际长度将变成13+13+1=27(\0) 字节 。
(2) 如果对SDS的修改之后,SDS的长度大于 1MB ,那么程序会分配1MB 的未使用空间 。
例如 len =20MB ,SDS 的buf数组的长度为 20MB+1MB+1byte。
3 惰性释放空间
惰性释放空间用于 SDS的字符串缩短操作:当SDS的API 需要缩短SDS的字符串时,程序并不立即使用内存重分配来回收缩短多出来的字节。而是用free属性讲这些字节记录起来。