Redis 设计与实现---第一章:简单动态字符串
字符串对象:
redis没有直接使用C语言传统字符串,而是自己封装了一种叫做:简单动态字符串(simple dynamic string,SDS)抽象类型,就是为了实现高效修改
C语言的字符串:是以空字符串结尾的字符数组
redis SDS长这样:
两个字符串差异对比:
SDS依旧遵循空格结尾,这样很多方法可以复用,不必重复造轮子,字节数组
SDS优点:
1. C字符串获取长度必须遍历整个字符串,复杂度为O(N),而SDS使用len属性记录了字符串长度,所以复杂度为O(1),同理在执行strlen命令,复杂度也仅为O(1)
2. SDS在需要增加字符串时,自动检查内存空间是否足够,不够时会先申请足够的内存再进行增加,这个过程不需要手动干预,而且不会发生缓冲区溢出问题
兼容C字符串
使用场景:
C字符串: 仅作为字符串字面量用在一些无需对字符串值进行修改的地方比如打印日志
SDS字符串:数据库中的键,值,缓冲区buffer,AoF的缓冲区,以及客户端输入缓冲区
SDS空间分配策略:
C字符串的内存分配:用多少拿多少,程序员必须在增加或裁剪时重新分配空间,否则造成内存溢出或内存泄漏。每次修改都需要重新分配内存。
SDS分配策略:申请内存时多拿点(官话:预分配),释放内存时先用着(官话:惰性释放)。使用free属性记录未使用空间大小,有效减少内存分配次数
二进制安全:
C字符串必须符合某种编码,且字符串里不能包含空格,故C字符串只能保存文本数据,无法保存图片,音频,视频,压缩文件等二进制数据。
SDS 对buffer里的内容使用二进制的方式处理,保证写入是什么样,读出来就是什么样,SDS使用len属性判断是否结束,而不是尾部空格,这样就可以保存任意格式的二进制数据
总结: