引子

redis是由c语言实现的,但是redis中的字符串并没有直接使用c语言中的字符串,因为c语言字符串存在以下问题:

  • 获取字符串长度的需要通过运算
  • 非二进制安全
  • 不可修改

因此,Redis构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称SDS

结构

SDS为结构体,其中有4个参数:

  • len:buf已保存的字符串字节数,不包含结束标示
  • alloc:buf申请的总的字节数,不包含结束标示
  • flags:不同SDS的头类型,用来控制SDS的头大小
  • buf[]:实际存放数据的数组

动态扩容

SDS之所以叫做动态字符串,是因为它具备动态扩容的能力(在存放了某个字符串后,可以在后面追加字符串)

  • 如果新字符串(原字符串+追加的字符串)小于1M,则新空间为扩展后字符串长度的两倍+1;
  • 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1。

称为内存预分配

优点

  • 获取字符串长度的时间复杂度为O(1)
  • 支持动态扩容
  • 减少内存分配次数
  • 二进制安全
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐