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语言字符串有以下几个问题:
redids改进:
- redis的结构中存储了字符串的长度,所以获取字符串的长度的时间复杂的为O(1)
- 由于redis分配的空间不是按照需要的分配,一般会有多余的空间(空间预分配)。所以字符串长度增加时,剩余的空间足够,就可以避免重新分配空间。减少字符的长度时也不是直接删除多余的内容。而是设置已使用空间的长度,隐藏删除内容(惰性释放)。
- redis会先检查总的空间大小,满足才会分配,避免缓存区溢出;
- 采用二进制存储,不存在空白符的干扰
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。