Redis 数据结构(一)—— 简单动态字符串(SDS 和 C字符串的区别)

1. SDS 的定义

简单动态字符串大概是下边这个鬼样子,储存了下边这些东西:

  • 已有字符串长度
  • buff空闲的长度
  • buff字符数组

在这里插入图片描述

2. SDS和C字符串的区别

至于SDS和C字符串的区别,我们先来个表吧,先大概看一看,然后一条一条的解释。
在这里插入图片描述

  • 获取字符串多长更快了!
    这个解释起来简单,SDS结构体里存了当前字符串的长度,直接读就行,时间复杂度为O(1),而C字符串没存长度,统计长度的时候要把字符串从头到尾的遍历一遍,时间复杂度O(n)。

  • 不会有缓冲区溢出!
    这个也好解释,对于C字符串进行字符串拼接的时候,不检查空间够不够,直接就是干,把一堆字符串就放在当前字符串后边了。那要是原来字符串后边有其他字符串就完蛋了,把别人整坏了!!而对于SDS而言,在对当前字符串进行修改时会检查空间够不够啊,不够就在给分点,保证了修改操作不会有溢出问题。

  • 修改字符串长度不会老分配内存!
    这个也不难,刚才咱们说了,直接修改C字符串可能会产生溢出,所以呢,想要保证不溢出,这个事情就得甩锅到程序员身上。只要我们进行修改就得重新给他分配足够的空间,不用了就得释放掉。那SDS就比较nb了,他自己来做这些事儿,我们开始的时候介绍了free这个属性,这就说明了他自己给自己的内存分配不是正好的,可能会有富裕,这样一来我们做字符串修改的时候就不用每次都进行内存分配了。(其实,具体的的机制有两种 1. 空间预分配 2. 空间惰性释放)

  • 二进制安全!
    C字符串只能保存文本数据(文本转成某种编码),那如果我们读的时候编码搞错了,就会读到一堆乱码。。。还有就是C字符串认为空格就结束了,例如我们保存“I Love U”,他就只会保存“I”,也不知道你爱谁。而SDS就比较nb了,他可以直接保存二进制信息,什么音频视频杂七杂八都能存了,而且因为他有当前字符长度所以也不吧空格当成结束了。

  • 兼容部分C字符串函数!
    这个就不对逼逼了,SDS字符串是在原有C字符串上改的,又不是创造的,能用很正常!

3. SDS API

接下来列出一些SDS常用的API吧!
在这里插入图片描述
在这里插入图片描述
好了,用户下单了得去送外卖了,明天见!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从前慢慢慢死了

打钱!一分也行啊!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值