redis没有使用c的字符串,而是本身构建了sds,可是为了重用c字符串的不少方法,sds跟c同样最后一个字节保存一个空字符‘\0’redis
sds与c字符串的主要区别缓存
一、c获取字符串长度的复查度是o(N),而sds是o(1),sds的长度动态记录在len中安全
二、缓存区溢出,c字符串不记录自身长度,在字符串合并时可能会形成缓冲区溢出,sds在字符串拼接时候,会检查空间时候足够,若是不足,会先扩容,而后才执行拼接操做函数
三、sds比起c字符串,减小字符串修改时内存的重分配次数,sds采用空间预分配和惰性空间释放策略spa
3.1 空间预分配
视频
当字符串增加时候,sds不只会分配增加须要的空间,还会额外分配未使用空间。修改后sds的长度(len)小于1MB,会额外分配 len 长度的空间;sds修改后的长度(len)大于1MB,会额外分配1MB空间图片
3.2 惰性空间释放
内存
当sds收缩时,并不会当即回收释放的空间,而是使用free标记起来,等待未来使用字符串
四、二级制安全音频
c字符串在读到'\0'时候,就认为是字符串结尾,这样的限制使得c字符串自能保存文本数据,不能保存图片,音频,视频等数据,而sds都会以处理二进制的方式来处理buf里面的数据,数据写进去是什么样,读出来就是什么样
五、兼容c字符串函数
sds采用末尾保留'\0',就是为了兼容c字符串