SDS定义
- 这里简单说明一下:buf空间大小等于len加上free加上1个字节
- 为什么需要加1个字节呢,因为为了SDS可以兼容调用C字符串函数
SDS比C字符串的优势
第一:字符串长度获取复杂度降低
- 复杂度由原来的O(n) 降低成O(1)
第二:SDS杜绝缓存区的溢出
- SDS预先检查空间是否足够,自动为其分配空间,可以看第三点的分配规则
- C字符串需要手动为其分配空间【可能忘记了,就会导致这种情况】
第三:减少修改字符串时带来的内存重分配次数
- 空间预分配:当len的值小于1MB时,程序会自动分配和len同样大小的未使用空间free, 也就是len==free。当len的值大于等于1MB时,程序会自动分配1MB未使用空间free, 也就是free == 1MB
- 惰性空间释放:简单的来说的话,buf 字节数组中,存在 redis 这几个字符,len值为5 ,free值为0 时,现在我需要将redis 变成red ,那这个时候 ,len 为 3 ,free 2 。减少内存重分配次数,SDS 提供了相应的API , 对其进行空间释放。
第四:二进制安全
- SDS 可以存储文本或者二进制数据
第五:部分兼容字符串函数
- SDS遵循C字符串以空字符串结尾的惯例,这样可以部分使用字符串函数