Redis数据结构之String
Redis是C语言编写的,C语言有字符串,但是Redis并没有采用C的字符串而是自己构建出SDS
即简单动态字符串,那么肯定是C的字符串某种情况下不满足Redis的需求,才自己造轮子。
SDS 与 C字符串 区别
- 长度计算方式
- C字符串需要遍历之后,最后是以
\0
结尾。O(n)时间复杂度才能得出长度。 - SDS采用len属性,O(1)时间复杂度获取长度。
- C字符串需要遍历之后,最后是以
- 杜绝缓冲区溢出 - 字符串拼接未计算好内存可能会导致缓冲区溢出。
- C字符串需要计算内存大小。
- SDS进行判断free,如果够就拼接,如果不够就扩容。
- 减少内存分配和回收的开销
- C字符串 N+1大小
- 1为 \0 结束符
- SDS
- 内存预分配 - len + free 避免总是内存分配
- 惰性释放 - 字符串缩减时,不必立即释放内存,以免再进行分配。
- C字符串 N+1大小
- 二进制安全
- C字符串
- 音视频中或出现\0的字符串中C字符串比较无力。
- SDS
- 进行长度判断,读取长度的字符串即可。
- C字符串