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