Redis 数据结构之SDS

Redis SDS详解
本文介绍了Redis中自定义的简单动态字符串(SDS)结构,对比了SDS与C语言字符串的不同之处,包括获取字符串长度的方式、如何避免缓冲区溢出及惰性释放空间策略。

Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符(SDS)串的数据结构

一 SDS 的定义

struct{

int len;  // 记录buf数组中已使用的字节数量                                                                

int free; // 记录buf数组中未使用的字节数量           

char buf[]  ;                                                  

  }      

184947_37Ps_3218528.png                                                                                               

free 属性  的值为0,表示这个SDS没有分配任何未使用的空间

len 属性的值为5,表示这个SDS 保存了一个5字节长的字符串

看下图

190922_UzwM_3218528.png    

                                  

free 属性  的值为2,表示这个SDS分配2个未使用的空间                                                          

           

二  SDS 与 C字符串的区别

    1  获取字符串的长度

          SDS 根据 len 即可获取

          C 字符串 需要遍历数组 直到遇到 \0

    2 杜绝缓冲区溢出

       SDS 的空间分配策略完全杜绝了发生缓冲区溢出的可能性。

         SDS 的空间分配策略

         (1)对SDS进行修改之后,如果SDS的len小于1MB,那么程序分配和len 属性同样大小的未使用空间

           例如 len = 13,SDS的buf数组实际长度将变成13+13+1=27(\0) 字节 。

          (2) 如果对SDS的修改之后,SDS的长度大于  1MB ,那么程序会分配1MB 的未使用空间 。

           例如 len =20MB ,SDS 的buf数组的长度为 20MB+1MB+1byte。       

   3 惰性释放空间

        惰性释放空间用于 SDS的字符串缩短操作:当SDS的API 需要缩短SDS的字符串时,程序并不立即使用内存重分配来回收缩短多出来的字节。而是用free属性讲这些字节记录起来。                         

转载于:https://my.oschina.net/u/3218528/blog/1613141

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值