Redis简单动态字符串(SDS)

Redis只会使用C字符串作为字面量。大多数情况下,redis使用SDS作为字符串表示
SDS (simple dynamic string)

struct sdshdr {
    int len;	//记录buf数组中已使用字节的数量,等于SDS所保存字符串的长度
    int free;	//记录buf数组中未使用字节的数量
    char buf[]; //字节数组,用于保存字符串
};

Redis简单动态字符串(SDS)_第1张图片

C字符串和SDS之间的比较,也是为什么使用SDS的原因:
  1. 直接通过字段获取字符串长度,提高了效率
  2. C字符串处理函数存在安全问题,如strcat
  3. SDS有空间预分配,有一套自己的扩容机制,在这该机制下,加少了重生内存分配的次数
  4. C字符串以"\0"结束,二进制不安全
  5. SDS仍然可以利用C字符串的函数
SDS的free空间来自两种策略
  1. 空间预分配

    若修改之后的len<1MB, 则分配 free = len

    若修改之后的len>=1MB, 则分配free = 1 MB

  2. 惰性空间释放

    例如:sdstrim会对两端无用删减后,字符串整体位移到首部

你可能感兴趣的:(#,Redis,redis,缓存)