Redis 源码学习-Simple Dynamic String

Redis只会使用C字符串作为字面量,在大多数情况下,Redis使用SDS作为字符串表示。

比起C字符串,SDS具有以下优点:

  1. 常数复杂度获得字符串长度。
  2. 杜绝缓冲区溢出。
  3. 减少修改字符串长度时所需的内存重分配次数。
  4. 二进制安全。
  5. 兼容部分C字符串函数。
数据结构
struct sdshdr {
    
    // buf 中已占用空间的长度
    int len;

    // buf 中剩余可用空间的长度
    int free;

    // 数据空间
    char buf[];
};
解析

len记录buf数组中已使用字节的数量,等于SDS所保存的字段长度。free记录buf数组中未使用字节的数量。buf为字符串的数据空间,它的长度为len+free+1,因为它需要多存一个'0'作为结束标识。

为什么要多存'0'

C语言中的字符串为Null-terminated String,它用'0'来表示字符串的结束。并且除了字符串末尾之外,字符串内不能包含空字符,否则最先被读到的空字符会被误认为结束标识。

这种存储二进制和读取不一致的情况被称为Binary Unsafe。为了实现二进制安全,redis采用len属性来记录当前字符串长度。

你可能感兴趣的:(redis)