【学习笔记】Redis学习笔记——第2章:简单动态字符串

第2章:简单动态字符串

Redis用作键值对或AOF缓冲区的字符串为SDS(简单动态字符串),而不是C语言传统字符串(只用作打印log等不会修改字符串值的地方)。

2.1 SDS的定义

{
	//SDS字符串长度(buf数组中已使用的空间)
	int len;
	//buf数组中未使用的空间
	int free;
	//字节数组,用于保存字符串
	char buf[];
}

2.2 SDS与C字符串的区别

2.2.1 常数复杂度获取字符串长度

C语言的传统字符串相当于SDS中的buf[],获取字符串长度时的时间复杂度为O(n),而SDS显然为O(1)。

2.2.2 杜绝缓冲区溢出

在修改字符串等操作时,会先判断是否会溢出,即原本的buf[]空间是否足够,若不够,会先对buf[]进行扩展。

2.2.3 减少修改字符串时带来的内存重分配次数

1>空间预分配
SDS扩展时,小于1MB,会分配与len同样的未使用空间,大于1MB时,分配1MB未使用空间。
2>惰性空间释放
在移除SDS中部分字符串时,不马上回收空间,而是使用free记录,在真正需要释放空间时调用方法释放空间。

2.2.4 二进制安全

C字符串以’\0’结尾,二进制或带有’\0’的字符串会识别错误。
SDS以len记录字符串数据,不会错误识别原字符串汇总的’\0’。

2.2.5 兼容部分C字符串函数

SDS中的buf[]在保存文本数据时,相当于C字符串。

SDS API

略,原书P17。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值