redis基础机构之简单字符串

简单动态字符串

SDS的定义
       struct sdshdr{
            int len;   //记录buf中已经使用字节的数量 不包括'\0'
            int free;  //记录buf中未使用字节的数量
            char buf[]; //字节数组,用于保存字符串,会设置数据的末尾为‘\0'  这样可以兼容部分c标准库函数
       };  
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190603233257284.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3MjMyMjI4,size_16,color_FFFFFF,t_70)
SDS较C字符串的优势 例:struct sdshdr *s
   1.计算长度
       可以o(1)时间复杂度获取长度   s->len
   2.缓冲区溢出:
       c的strcat(char *dest,const char*src)拼接函数在拼接时可能会覆盖相邻字符串,当src+dest长度大于dest分配空间,将会产生缓冲区溢出;
       对于sds,它在拼接的时候会校验所需空间是否大于s->free的空间,如果大于才会进行空间的分配,这样可以减少内存分配;
    3.二进制安全:
          SDS的API都是二进制安全的,它的API都是以二进制的方式进行出行SDS的buf数组的数据的;
    4.兼容部分c字符串函数:
            SDS总会在数据的末尾(中间可以有n个'\0')设置为空字符,与C字符串以空字符串结尾的相似,所以可以沿用部分c的字符串函数;
空间分配策略
           它的空间预分配规则可以减少内存分配次数:
                 当拼接增加sds之后,s->len大小小于1MB,那么将会分配给s->free相同的字节,例如拼接之后s->len长度为150,则s->free也为150;
                 当拼接之后的s->len长度大于1MB,则为s->free分配1MB的大小 ;
            它的惰性空间释放:
                  惰性空间释放用于优化 SDS 的字符串缩短操作: 当 SDS 的 API 需要缩短 SDS 保存的字符串时, 程序并不立即使用内存重分配来回收缩短后多出来的字节, 而是使用 free 属性将这些字节的数量记录起来, 并等待将来使用。redis提供API在有需要的时候,真正释放未使用空间,所以不用担心内存泄漏;
                  API:sdstrim(s, "XY");   // 移除 SDS 字符串中的所有 'X' 和 'Y'
                 
                  ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190603232321382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3MjMyMjI4,size_16,color_FFFFFF,t_70)     
                  
          ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190603232415368.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3MjMyMjI4,size_16,color_FFFFFF,t_70)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值