Redis是用C语言编写的。C语言处理字符串一贯是个难点。很容易出现内存越界问题。nginx
其它高级语言很容易实现的字符串拼接,在C这里倒是百般艰难。由于须要实现计算出字符串所占内存的大小。即不能过大(浪费内存),也不能过小(越界)。甚至在某个用C语言实现的项目中出现了这样的代码redis
即,先计算出字符串的大小。而后申请内存,再拼接字符串。函数
这样的操做几乎是没法忍受的。特别是当咱们的字符串构成比较复杂,或者字符串常常须要发生变动时。3d
redis的解决方案是使用了一个结构体,一组操做函数,将这个复杂的操做包装起来。blog
这样的字符串操做中,再也不出现字符串计算。再也不出现动态内存分配。全部的这些操做都被包含在sds的操做函数中。内存
Redis实际上是定义了一个结构体:字符串
而且sds为了兼容C缘由的char* . 内容依然是以\0为结尾。这点和nginx的ngx_string不太同样。string
做为strlen的替代品,sds也提供了sdslen效率
原来的strlen的时间复杂度是O(n), 而sdslen的时间复杂度是O(1)im
sds的内存扩容,当内存占用小于1M时,它每次都会扩大为原来的两倍。这样平摊下来扩容的时间复杂度也为O(1)。也是效率很是高的
当内存占用已超过1M时,它每次只会增加1M,而再也不是原来的两倍。能够略省内存。