Redis教程

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

本文主要是介绍Redis 数据结构(一)—— 简单动态字符串(SDS 和 C字符串的区别),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

    • 1. SDS 的定义
    • 2. SDS和C字符串的区别
    • 3. SDS API

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吧!
在这里插入图片描述
在这里插入图片描述
好了,用户下单了得去送外卖了,明天见!

这篇关于Redis 数据结构(一)—— 简单动态字符串(SDS 和 C字符串的区别)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!