《Redis设计与实现》阅读总结-1

第 2 章 简单动态字符串(SDS)

1. Redis使用自己构建一种名为简单动态字符串(simple dynamic string ,SDS)的抽象类型,作为Redis的默认字符串。

2. SDS的结构:

        free属性:表示这个SDS没有分配任何使用的空间;

        len属性:表示SDS保存字符串的长度;

        buf[]属性:用于保存字符串(数组的最后一个字节则保存了空字符'\0',且这空字符不计算SDS的len属性里面)。

3. SDS的好处:

        降低获取字符串长度的复杂度(0(n)-->o(1)),确保获取字符串长度工作不会成为Redis的性能瓶颈。

        杜绝缓冲区溢出,例如SDS在使用sdscat函数(拼接操作)时,首先后检查SDS的空间是否足够,不够先扩展空间,然后在拼接。

        减少修改字符串时带来的内存重分片次数,通过未使用空间(即free属性记录的长度),SDS实现了空间预分配和惰性空间释放两种优化策略。

4. 空间预分配公式:

        SDS长度(len属性的值,单位:字节)小于1MB时,程序分配len属性同样大小的free属性的未使用空间。

        SDS长度大于1MB时,程序分配1MB的未使用空间。

5. 惰性空间释放:

        当SDS缩短保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而使用free属性将这些字节的数量记录起来,并且等待将来使用。

6. Redis二进制安全:

        SDS的API都是二进制安全的(binary-safe),所有SDS API都会以二进制的方式处理SDS存放在buf数组里的数据,程序不会对其中的数据做任何限制、过滤、或假设,数据写入时是什么样的,取读还是什么样的。

7. 兼容部分C语言字符串函数,实现复用。

8. C字符串与SDS之间的区别:

9. SDS API:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanxiaozhang2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值