第 2 章 简单动态字符串(SDS)
1. Redis使用自己构建一种名为简单动态字符串(simple dynamic string ,SDS)的抽象类型,作为Redis的默认字符串。
2. SDS的结构:
free属性:表示这个SDS没有分配任何使用的空间;
len属性:表示SDS保存字符串的长度;
buf[]属性:用于保存字符串(数组的最后一个字节则保存了空字符'\0',且这空字符不计算SDS的len属性里面)。
3. SDS的好处:
降低获取字符串长度的复杂度(0(n)-->o(1)),确保获取字符串长度工作不会成为Redis的性能瓶颈。
杜绝缓冲区溢出,例如SDS在使用sdscat函数(拼接操作)时,首先后检查SDS的空间是否足够,不够先扩展空间,然后在拼接。
减少修改字符串时带来的内存重分片次数,通过未使用空间(即free属性记录的长度),SDS实现了空间预分配和惰性空间释放两种优化策略。
4. 空间预分配公式:
SDS长度(len属性的值,单位:字节)小于1MB时,程序分配len属性同样大小的free属性的未使用空间。
SDS长度大于1MB时,程序分配1MB的未使用空间。
5. 惰性空间释放:
当SDS缩短保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而使用free属性将这些字节的数量记录起来,并且等待将来使用。
6. Redis二进制安全:
SDS的API都是二进制安全的(binary-safe),所有SDS API都会以二进制的方式处理SDS存放在buf数组里的数据,程序不会对其中的数据做任何限制、过滤、或假设,数据写入时是什么样的,取读还是什么样的。
7. 兼容部分C语言字符串函数,实现复用。
8. C字符串与SDS之间的区别:
9. SDS API: