现在在高铁上, 赶着春节回家过年, 无座站票, 电脑只能放行李架上, 面对着行李架撸键盘--看过<Redis的设计与实现>这本书, 突然想起, 便整理下SDS的内容, 相对后面的章节, 算是比较简单的~
大多数情况下, Redis使用SDS(Simple Dynamic String, 简单动态字符串)作为字符串表示, 比起C字符串, SDS具有以下优点:
- 常数复杂度获取字符串长度;
- 杜绝缓冲区溢出;
- 减少修改字符串时带来的内存重分配次数;
- 二进制安全;
- 兼容部分C字符串函数.
以上列举的优点, 也算是这篇文章的主要内容. 先从定义说起吧:
1. SDS的定义
SDS结构定义如下(sds.h/sdshdr
):
struct sdshdr {
// 记录buf数组中已使用字节的数量, 等于SDS所保存字符串的长度
int len;
// 记录buf数组中未使用字节的数量
int free;
// 字节数组, 用于保存字符串
char buf[];
}
- len属性记录了已使用的字节数量(字符串长度);
- free属性的值为0, 表示这个SDS没有未使用的空间;
- free属性的值为5, 表示这个SDS保存了一个5字节长的字符串;
- buf属性是一个char类型的数组, 数组的最后一个字节保存了空字符0.
SDS遵循C字符串以空字符串结尾的惯例, 空字符不计入SDS的len属性, 即额外为空字符分配了1字节的空间, 并且添加空字符到字符串末尾均由SDS函数自动完成, 对使用者完全透明. 该特性带来的好处是, SDS可以直接复用C字符串函数库的部分函数.
阅读全文