通过这种预分配策略,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字符串函数
推荐阅读
- 分布式系统之Redis主从架构
- 跑高速到底用“S”挡还是“D”挡?交警:这么简单的问题还用问
- 黑茶两种冲泡方法,黑茶冲泡简单方法
- PHP操作Redis常用方法总结
- 一篇详解Redis延时队列
- 阿里P9架构师分享:通俗易懂Redis原理,都是你没看过的
- 困扰无数人的Linux Vim退出方法,原来这么简单?
- 香水保质期一般多久,教你保存香水的简单方法
- 治疗宝宝流口水最简单方法是什么?
- 加快Mac速度的10条简单技巧
