Redis简单动态字符串 全面剖析( 二 )


通过这种预分配策略,SDS将连续增长N次字符串所需的内存重分配次数从必定N次降低为最多N次 。
惰性空间释放
惰性空间释放用于优化SDS的字符串缩短操作:当SDS的API需要缩短SDS保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而是使用free属性将这些字符的数量记录起来,并等待将来使用 。
通过惰性空间释放策略,SDS避免来缩短字符串时所需的内存重分配操作,并为将来可能有的增长操作提供了变化 。
二进制安全
C语言字符串中的字符必须符合某种编码(比如ASCII),并且除了字符串的末尾之外,字符串里面不能包含空字符,否则最先被程序读入空字符将被误认为是字符串结尾,这些限制使得C字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据 。
为了确保Redis可以适用于各种不同的使用场景,SDS的API都是二进制安全的,所有SDS API都会以处理二进制的方式来处理SDS存放在buf数组里的数据,程序不会对其中数组做任何限制、过滤、或者假设,数据在写入时是什么样的,它被读取时就是什么样 。
兼容部分C字符串函数
通过遵从C语言字符串以空字符结尾的惯例,SDS可以在有需要时重用<string.h>函数库,从而避免来不必要的代码重复 。
总结比起C语言字符串,SDS具有以下优点:

  • 常数复杂度获取字符串长度
  • 杜绝缓冲区溢出
  • 减少修改字符串时带来的内存冲分配次数
  • 二进制安全
  • 兼容部分C字符串函数




推荐阅读