游戏运营备案官方网站,中国广播电视总台官网,广州网站开发广州亦客网络,建设银行网银网站激活Redis是用C语言编写的。C语言处理字符串一向是个难点。很容易出现内存越界问题。 其它高级语言很容易实现的字符串拼接#xff0c;在C这里却是百般艰难。因为需要实现计算出字符串所占内存的大小。即不能过大#xff08;浪费内存#xff09;#xff0c;也不能太小#xff…Redis是用C语言编写的。C语言处理字符串一向是个难点。很容易出现内存越界问题。 其它高级语言很容易实现的字符串拼接在C这里却是百般艰难。因为需要实现计算出字符串所占内存的大小。即不能过大浪费内存也不能太小越界。甚至在某个用C语言实现的项目中出现了这样的代码 即先计算出字符串的大小。然后申请内存再拼接字符串。 这样的操作几乎是无法忍受的。特别是当我们的字符串构成比较复杂或者字符串经常需要发生变更时。 redis的解决方案是使用了一个结构体一组操作函数将这个复杂的操作包装起来。 这样的字符串操作中不再出现字符串计算。不再出现动态内存分配。所有的这些操作都被包含在sds的操作函数中。 Redis其实是定义了一个结构体 并且sds为了兼容C原因的char* . 内容依然是以\0为结尾。这点和nginx的ngx_string不太一样。 作为strlen的替代品sds也提供了sdslen 原来的strlen的时间复杂度是O(n), 而sdslen的时间复杂度是O(1) sds的内存扩容当内存占用小于1M时它每次都会扩大为原来的两倍。这样平摊下来扩容的时间复杂度也为O1。也是效率非常高的 当内存占用已超过1M时它每次只会增长1M而不再是原来的两倍。可以略省内存。 转载于:https://www.cnblogs.com/jackson-zhou/p/8012471.html