简单动态字符串SDS

因为redis使用C语言实现

  1. 定义
    结构体
    struct sdshdr{
    //记录buf数组已经使用字节的长度
    //等于SDS已经保存字符串的长度
    int len;
    //记录buf数组未使用的长度
    int free;
    //字节数组,用来保存字符串
    }
    buf是char类型的数组,最后一个字符为’\0’,不管是C语言字符串还是SDS字符串都以’\0’作为结束.并且分配一个字节,但是不记录在SDS的len内,遵循这个一空字符串结尾的习惯好处是可以重用C语言字符串的一些函数
  2. SDS与C语言字符串的区别,为什么Redis更适合SDS
    (1). SDS字符串记录了字符串的len,在获取长度这里复杂的从O(n)降成O(1),这确保获取字符串长度的工作不会成为redis的瓶颈,哈哈,那么STRLEN 命令的复杂的为O(1)
    (2). 杜绝缓冲区溢出,C语言字符串在进行拼接操作的时候需要提前分配足够的空间,否则产生缓存溢出,也就是空间不足了,SDS字符串修改之前会主动计算,不满足扩展空间
    (3). C语言频繁的计算字符串需要的空间,频繁的内存重分配,SDS使用空间预分配和惰性空间释放两种优化策略
空间预分配是优化字符串空间增长的操作,对SDS扩展的时候,不仅分配必要的空间,还会分配格外未使用的空间,其中如果对SDS修改之后的字符串长度也就是len的属性大小小于1MB,那么程序还会分配空闲空间free一样的大小,其中free和len的大小相等,如果大于1MB,那么free的大小为1MB惰性空间释放是应用于字符串缩短操作,不是立即回收,而是留下来记录在free里边,等待后续的使用

(4). 二进制安全,C语言字符串必须符合某种编码(比如ascll),并且除了末位之外不能包含空格字符,所以C语言只能保存文本数据,而不能保存图片文件,原因是C语言保存的最后都是以这个’\0’ 结尾,碰到第一个就会被认为结束,所以造成数据的不完整,而SDS则可以保证二进制的数据完整性也就是数据安全,原因是SDS最后的字符才是’\0’,所以可以保存任意格式的二进制数据.
(5). 兼容C语言字符串的一部分函数,说白了就能用C语言函数(字符串的),SDS最后总是保存一个字节的’\0’

  1. 总结
对比项目C语言SDS字符串
获取字符串长度的复杂度O(N)O(1)
API安全吗?会不会造成缓存溢出不安全,可能造成缓存溢出安全,不会出现缓存溢出
修改字符串长度N次,造成内存重分配的次数必然n次最多n次
文本保存只能为文本数据文本或者二进制格式
对于C语言库函数的使用<string.h>全部部分
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值