Redis数据结构之String

Redis是C语言编写的,C语言有字符串,但是Redis并没有采用C的字符串而是自己构建出SDS简单动态字符串,那么肯定是C的字符串某种情况下不满足Redis的需求,才自己造轮子。

SDS 与 C字符串 区别

  1. 长度计算方式
    1. C字符串需要遍历之后,最后是以\0结尾。O(n)时间复杂度才能得出长度。
    2. SDS采用len属性,O(1)时间复杂度获取长度。
  2. 杜绝缓冲区溢出 - 字符串拼接未计算好内存可能会导致缓冲区溢出。
    1. C字符串需要计算内存大小。
    2. SDS进行判断free,如果够就拼接,如果不够就扩容。
  3. 减少内存分配和回收的开销
    1. C字符串 N+1大小
      1. 1为 \0 结束符
    2. SDS
      1. 内存预分配 - len + free 避免总是内存分配
      2. 惰性释放 - 字符串缩减时,不必立即释放内存,以免再进行分配。
  4. 二进制安全
    1. C字符串
      1. 音视频中或出现\0的字符串中C字符串比较无力。
    2. SDS
      1. 进行长度判断,读取长度的字符串即可。