redis 动态字符串
概述
Sda(Simple Dynamic String) 简单动态字符串是 redis中用来表示字符串的结构,而不是传统 C 字符串。 主要的特点就是Sda要做到高效和
二进制安全的,
Sda 在Redis中的主要作用有以下两个 :
- 实现字符串对象
- 在 Redis 程序中内部用作 char* 类型的替代品
Sda的特性
- 常数复杂度获取字符串长度
- 杜绝缓冲区溢出
- 减少内存重新分配次数
- 二进制安全(什么是二进制安全)
Sda 分析
sda结构
传统C的字符串识别结束的标志是‘/n’, Sda和这有很大区别,它的结构如下 :
typedef char *sds; struct sdahdr{ //buf 已占用长度 int len; //buf 剩余可用长度 int free; //实际保存字符串数据的地方 char buf[]; }
例如我们放入‘hello world’的字符串。那么结构就如下图一样。
len 属性可以为 sda 实现复杂度为 0(1)的长度计算操作,另外一方面,free 字段在分配空间时记录未使用的空间大小。
减少修改字符串时带啦IDE内存从分配次数
字符串追加,就像 java 中 StringBuild 的 append 操作,sda内部使用了内存预分配优化和惰性空间释放策略,空间预分配简单点说就是当接近空间容量时,会预先申请空间;而惰性空间分配则是
当sda字符串缩短的时候,程序并不会立即马上回收去除字符串的空间,而是增加在 free 字段中,以便在后续使用。
二进制安全
C字段串中的字符必须符合某种编码(比如ASCII),并且除了字符串的末尾之外,字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾,这些限制使得C字符串只能保存文本数据,而不能保存像图片,音频,视频, 这样的二进制数据,而sda 没有这个问题。
参考资料
- 《redis设计及实现》