Redis 5设计与源码分析
上QQ阅读APP看书,第一时间看更新

2.3 本章小结

本章介绍了SDS的数据结构及基本API的实现。在源码分析过程中,我们可以知道SDS的以下特性是如何实现的。

1)SDS如何兼容C语言字符串?如何保证二进制安全?

SDS对象中的buf是一个柔性数组,上层调用时,SDS直接返回了buf。由于buf是直接指向内容的指针,故兼容C语言函数。而当真正读取内容时,SDS会通过len来限制读取长度,而非“\0”,保证了二进制安全。

2)sdshdr5的特殊之处是什么?

sdshdr5只负责存储小于32字节的字符串。一般情况下,小字符串的存储更普遍,故Redis进一步压缩了sdshdr5的数据结构,将sdshdr5的类型和长度放入了同一个属性中,用flags的低3位存储类型,高5位存储长度。创建空字符串时,sdshdr5会被sdshdr8替代。

3)SDS是如何扩容的?

SDS在涉及字符串修改处会调用sdsMakeroomFor函数进行检查,根据不同情况动态扩容,该操作对上层透明。