最近在看《redis设计与实现》这本书,写一套日志来记录一下学习历程。
1.SDS -〉 简单动态字符串
在redis 当中,所有的字符串都是以SDS的形式存在的。该对象的作用除了可以用来保存库中的字符串值之外,
还可以做为缓冲区:
1).AOF模块中的AOF缓冲区。
2).客户端状态中的输入缓冲区。
SDS的结构如图所示,可见其实SDS内部是采用一个字节数组用于保存字符串的。
SDS相较于C语言中的字符串有如下几个优点:
1).快速获取字符串长度。
因为在C语言的字符串中,是没有记录字符串长度的,所以每次获取字符串长度时,就需要遍历该字符串。
而SDS中存储了字符串的长度,每次求长度只需要获取SDS中len的值就可以了。
2).避免缓冲区的溢出。
因为C语言字符串不存长度,所以在对字符串进行拼接操作时,如果忘记了给新的字符串分配内存,就会造成缓冲区溢出。
3).减少字符串修改带来的内存重新分配次数。
如第二点所说,C语言字符串中对其修改时,会频繁的对内存进行重新分配,而该操作是一个较为耗时的一个操作,所以SDS采用预分配空间和惰性空间释放两种方式来减少内存重新分配的次数。
4).能够保存二进制数据。
在C语言的字符串中,判断一个字符串是否到达结尾,是通过 /0 的这样的一个标识来判断的,所以C语言的字符串只能存储文本数据。
而SDS判断字符串是否到达结尾是根据SDS中的len属性进行判断,所以可以存储其他类型的数据。
5).兼容部分C字符串函数。
总结: