1、介绍:
redis没有使用C语言本身的字符串,而使用简单动态字符串SDS(Simple Dynamic String)这种抽象类型。
2、实现:
struct{
int len;
int free;
char[] buf[];
}
3、为什么要使用SDS?为什么不适用C语言本身的字符串?如何扩容?
- 常数复杂度获取字符串长度(以空间换时间)
因为C语言本身的字符串进行length计算的时候复杂度为O(N),SDS本身具有len属性,使用SDS后计算length的复杂度为O(1)
- 杜绝缓冲器溢出
SDS的API会检查SDS的空间是否满足修改的要求,不满足的话会自动扩展到所需的要求。
- 减少修改字符串时所需的内存重分配次数(以空间换时间)
空间预分配
惰性空间释放
- 二进制安全
因为C语言的字符串使用空格结尾,不能包含空格,所以C字符串只能保存文本数据,不能保存图片、视频等数据。
使用SDS可以使redis不仅可以保存文本数据,还可以保存二进制数据。
- 兼容部分C字符串函数