《Redis设计与实现》学习笔记1

70 阅读2分钟

第二章 SDS(simple dynamic string)简单动态字符串。

struct sdshdr {

//记录buf数组中已使用的字节数,等于sds所保存的字符串长度
int len;
//等于buf数组中未使用的字节数量
int free;
//字节数组,用于保存字符串
chat buf[];

}

SDS和C字符串的对比

SDS/C字符串获取长度时间复杂度API安全性修改长度内存分配保存数据类型使用<string.h>库函数
C字符串O(N)不安全,可能会缓冲区溢出修改长度N次必然要执行N次重新内存分配只能保存文本数据所有可用
SDSO(1)安全,不会缓冲区溢出修改长度N次最多执行N次重新内存分配文本数据或二进制数据部分可用
  • API安全:SDS的API对SDS进行修改时,会检查目前空间是否满足修改所需要求,不满足时会重新分配内存,原生的C字符串不会。
  • SDS修改字符串修改长度时内存分配策略:1 所需空间不足,如果修改后sds的len小于1MB,将分配和len同样大小的未使用空间。如修改过之后SDS的len为13字节,程序将分配13字节未使用空间给SDS,buf实际长度变为13(已使用) + 13(未使用) + 1(‘\0’保存空字符) = 27。如果修改后len大于1MB,将新分配1MB未使用空间给SDS。 2 缩短字符串的操作,并不会实际释放多余空间,会将多数来的空间保存在free中,等下次需要时直接使用。另外SDS提供了API用来实际释放未使用的空间。
  • 二进制安全 SDS的API都是二进制安全的,API都处理二进制的方式处理存放在buf里面的数据,所以一些特殊数据格式也是可以保存的(比如中间包含/0的字符串),因此buf才叫做字节数组。