ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-12-27 21:59:14  阅读:289  来源: 互联网

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

标签:SDS,Redis,修改,API,字符串,长度,溢出
来源: https://blog.csdn.net/qq_41010280/article/details/122180585

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有