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会先检查总的空间大小,满足才会分配,避免缓存区溢出;
- 采用二进制存储,不存在空白符的干扰
标签:字节,SDS,Redis,字符串,长度,数据结构 来源: https://www.cnblogs.com/lsgspace/p/16242841.html