Redis设实 - 01 简单动态字符串

《Redis设计与实现 黄建宏 著》第2章
该书基于Redis2.9,即Redis3.0开发版编写

Redis默认字符串为简单动态字符串(simple dynamic string,SDS)抽象类型
Redis中C字符串只会作为字符串字面量(string literal)用在一些无须对字符串值进行修改的地方,如打印日志

SDS数据结构

struct sdshdr{
// 记录buf数组中已使用字节的数量
// 等于SDS所保存字符串的长度
int len;
// 记录buf数组中未使用字节的数量
int free;
// 字节数组,用于保存字符串
char buf[];
};
例:
Redis设实 - 01 简单动态字符串
Redis设实 - 01 简单动态字符串

SDS与C字符串的区别

1. 常数复杂度获取字符串长度
SDS为O(1),C字符串为O(N)
2. 杜绝缓冲区溢出
对SDS修改时,API会先检查SDS空间是否满足修改所需的要求
3. 减少修改字符串时带来的内存重分配次数
两种优化策略空间预分配、惰性空间释放
1) 空间预分配
需增长SDS保存的字符串时
·若对SDS修改后,SDS长度小于1MB,则程序分配和len属性同样大小的未使用空间,即len和free属性的值相同
·若对SDS修改后,SDS长度大于等于1MB,则程序分配1MB未使用空间
2) 惰性空间释放
需缩短SDS保存的字符串时
不立即回收缩短后多出来的字节,而是使用free属性记录这些字节的数量,并等待将来再使用
4. 二进制安全
SDS API会以处理二进制的方式处理SDS存放在buf数组里的数据,程序不会对其中的数据做任何限制、过滤、或者假设
5. 兼容部分C字符串函数
遵循C字符串以空字符结尾的惯例
汇总:
Redis设实 - 01 简单动态字符串

SDS常用API

Redis设实 - 01 简单动态字符串
Redis设实 - 01 简单动态字符串