微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Redis数据结构二:简单动态字符串

  Redis数据结构系列:

  Redis数据结构(一):对外数据类型和底层数据结构

  Redis数据结构(二):简单动态字符串

 

  Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis认字符串表示;

  在 Redis 里面, C 字符串只会作为字符串字面量(string literal), 用在一些无须对字符串值进行修改的地方, 比如打印日志;

  当 Redis 需要的不仅仅是一个字符串字面量, 而是一个可以被修改的字符串值时, Redis 就会使用 SDS 来表示字符串值: 比如在 Redis数据库里面, 包含字符串值的键值对在底层都是由 SDS 实现的。

 在sds.h/sdshdr下定义了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';

  

C语言字符串有以下几个问题:

  • 计算字符串的长度时间复杂度为O(n);
  • 每一次删除增加字符串的长度,都需要重新分配空间;
  • 缓存区异常;
  • 类似ASCII码,字符串中不能出现空白符。否则认为是字符串的结尾;

redids改进:

  • redis的结构中存储了字符串的长度,所以获取字符串的长度的时间复杂的为O(1)
  • 由于redis分配的空间不是按照需要的分配,一般会有多余的空间(空间预分配)。所以字符串长度增加时,剩余的空间足够,就可以避免重新分配空间。减少字符的长度时也不是直接删除多余的内容。而是设置已使用空间的长度,隐藏删除内容(惰性释放)。
  • redis会先检查总的空间大小,满足才会分配,避免缓存区溢出;
  • 采用二进制存储,不存在空白符的干扰

  

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐