redis_SDS

文章目录

SDS

struct sdshdr{
    //记录buf数组中已使用字节的数量
    //等于SDS所保存的字符串长度
    int len;
    //记录buf数组中未使用的字节的数量
    int free;
    //字节数组,用于保存字符串
    char buf[];
}

优点1: 常数复杂度获取字符串的长度

        C字符串中不记录字符串的自身长度信息,获取长度必须遍历整个字符串。时间复杂度O(n)

优点2: 杜绝缓冲区溢出

        C语言不记录自身长度,调用char* strcat(char *dest, const char *src);容易产生缓冲区溢出。而SDS有free参数先检查SDS的空间是否足够,不够的话会先扩展其空间。

优点3:减少修改字符串带来的内存重分配次数

        C字符串执行增长或者缩短字符串的操作需要内存的重新分配。而SDS采用空间预分配和惰性空间释放两种优化策略。
         1. 空间预分配:如果修改后长度小于1MB,程序会分配和len属性大小相同的未使用空间。如果修改后的长度为12,则会分配 12 + 12 + 1 = 25的字节(额外1字节保存空字符串)。如果大于1MB,程序会分配1MB的未使用空间,如果修改后的SDS长度为20MB,则buff数组的实际长度为30MB + 1MB + 1byte。
        2. 惰性空间释放,不主动释放空间。当字符串缩短时,记录在free中,为将来的字符串的可能的增长提供优化。

优化4:二进制安全

        C字符串不能存储空字符串。所以不能存储特殊的数据格式。因为它是利用空字符来表示字符串的结尾。而SDS利用len来判断是否是字符串的结尾。保证了二进制的安全。

优化5:兼容部分C字符串的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值