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

文章目录

1. SDS 的定义

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

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

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

2. SDS和C字符串的区别

至于SDS和C字符串的区别,我们先来个表吧,先大概看一看,然后一条一条的解释。
Redis 数据结构(一)—— 简单动态字符串(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吧!
Redis 数据结构(一)—— 简单动态字符串(SDS 和 C字符串的区别)
Redis 数据结构(一)—— 简单动态字符串(SDS 和 C字符串的区别)
好了,用户下单了得去送外卖了,明天见!

上一篇:为什么 Redis 的查询很快, Redis 如何保证查询的高效


下一篇:Redis之字符串