1:概述
redis中并没有使用c语言中的字符串,而是自己构建了一种名为简单动态字符串(SDS)的类型。作为redis的默认字符串表示。
2:SDS的定义
以下三部分构成:
- len:buf数组使用的字节数量,就是字符串长度,不包括结尾的空字符串
- free: 未使用的空间长度
- buf: 存储字符数组
SDS与C语言一样,遵循了以空字符串结尾的惯例。当然这个空字符不计入len中,这个空字符串对于用户来说是完全透明的。free当然也不包含空字符串。
为什么要空字符串结尾?
:主要是为了使用c语言字符串函数库里面的函数
3:SDS与C字符串的区别
3.1:O(1)时间复杂度获取字符串长度
与C字符串不同,SDS的len属性记录了字符串的长度(不包括结尾空字符)。所以获取一个SDS的长度的时间复杂度仅为O(1).
而C字符串需要一直遍历,找到结尾空字符,才能得到字符串长度。
而且在SDS中,设置和更新len都会自动完成。
所以通过使用SDS,redis将获取字符串长度的时间复杂度由O(n)降低到了O(1).
3.2:杜绝缓冲区溢出
C字符串容易溢出
SDS解决了缓冲区溢出的问题
3.3:减少修改字符串时带来的内存重分配次数
3.4:二进制安全
SDS使用len而不是空字符来判断字符串的结束
3.5:兼容部分C字符串函数
- 兼容部分C字符串函数