2.1 SDS
SDS(Simple Dynamic String在Redis里被用作动态字符串的实现。,是一个包含char数组的结构体。
- free 空闲数组
- len 已经使用的数组的长度
- buf 具体保存数组的地方
2.2 SDS与C字符串的区别
C语言使用长度为N+1的字符数组来存储长度为N的字符串,Redis为了提高效率并没有采用这种策略
- 提高获得字符串长度的效率即提高STRLEN的速度。 C语言字符串要想获得长度需要遍历整个数组 O(n),Redis只需要读取len存储的数值O(1)
- 杜绝字符串拼接可能带来的内存溢出。拼接之前检查free的大小能否装得下需要拼上去的字符串,装不下就要重新分配
- 灵活的空间分配策略减小在对字符串修改的时候内存空间申请与释放带来的消耗。空间预分配:当需要扩展SDS->buf数组的长度的时候,会预分配一定的冗余空间;惰性空间释放:SDS->buf出现空余的时候并不会回收,而是使用free记录下来便于下次使用
- 二进制安全。SDS通过len的值来判断buf何时结束,因此即使保存的二进制数据中有结束字符也不会带来影响
- 兼容部分C语言操作字符串的函数,因为SDS也使用'/0'作为结束标志