redis数据结构-简单动态字符串(sds)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

redis没有使用c的字符串,而是自己构建了sds,但是为了重用c字符串的很多方法,sds跟c一样最后一个字节保存一个空字符‘\0’

redis数据结构-简单动态字符串(sds)_第1张图片

sds与c字符串的主要区别

1、c获取字符串长度的复查度是o(N),而sds是o(1),sds的长度动态记录在len中

2、缓存区溢出,c字符串不记录自身长度,在字符串合并时可能会造成缓冲区溢出,sds在字符串拼接时候,会检查空间时候足够,如果不足,会先扩容,然后才执行拼接操作

3、sds比起c字符串,减少字符串修改时内存的重分配次数,sds采用空间预分配和惰性空间释放策略

    3.1 空间预分配

        当字符串增长时候,sds不仅会分配增长需要的空间,还会额外分配未使用空间。修改后sds的长度(len)小于1MB,会额外分配 len 长度的空间;sds修改后的长度(len)大于1MB,会额外分配1MB空间

    3.2 惰性空间释放

        当sds收缩时,并不会立即回收释放的空间,而是使用free标记起来,等待将来使用

4、二级制安全

    c字符串在读到'\0'时候,就认为是字符串结尾,这样的限制使得c字符串自能保存文本数据,不能保存图片,音频,视频等数据,而sds都会以处理二进制的方式来处理buf里面的数据,数据写进去是什么样,读出来就是什么样

5、兼容c字符串函数

    sds采用末尾保留'\0',就是为了兼容c字符串




转载于:https://my.oschina.net/u/172871/blog/534850

你可能感兴趣的:(redis数据结构-简单动态字符串(sds))