Redis中SDS和C字符串区别

SDS是simple dynamic string的缩写,简称简单动态字符串。

一、SDS结构

struct sdshdr {

    // 记录 buf 数组中已使用字节的数量
    // 等于 SDS 所保存字符串的长度
    int len;

    // 记录 buf 数组中未使用字节的数量
    int free;

    // 字节数组,用于保存字符串
    char buf[];

};
  • free 属性的值为 0 , 表示这个 SDS 没有分配任何未使用空间。
  • len 属性的值为 5 , 表示这个 SDS 保存了一个五字节长的字符串。
  • buf 属性是一个 char 类型的数组, 数组的前五个字节分别保存了 'R''e''d''i''s' 五个字符, 而最后一个字节则保存了空字符 '\0'

二、SDS和C字符串的区别

  • C 字符串

获取字符串长度的复杂度为 O(N) 。
API 是不安全的,可能会造成缓冲区溢出。
修改字符串长度 N 次必然需要执行 N 次内存重分配。
只能保存文本数据。
可以使用所有 <string.h> 库中的函数。 可以使用一部分 <string.h> 库中的函数。

  • SDS

获取字符串长度的复杂度为 O(1) 。(SDS结果中存储了len属性)
API 是安全的,不会造成缓冲区溢出。(自动分配内存)
修改字符串长度 N 次最多需要执行 N 次内存重分配。
可以保存文本或者二进制数据。
可以使用一部分 <string.h> 库中的函数。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>