Redis的SDS数据结构解决C语言字符串缺陷

redis设计了SDS这一数据结构来表示字符串而不是使用c语言的字符串:字符数组

那么redis为什么要大费周章自己设计字符串呢?

答案是C语言字符串有缺陷

1.获取字符串长度,需要遍历字符数组,时间复杂度是O(N)

2.字符串结尾以"\0"表示,因此字符串内容本身不能包含"\0",因此不能保存二进制数据

3.字符串操作函数不安全,可能会造成缓冲区溢出(这个你一定知道)

我们一一详细介绍这些c语言字符串的缺陷

1.获取字符串长度性能低

由于c语言字符串就是一个以’\0’结尾的字符数组,当你需要一个字符串的长度时,你可能会调用strlen函数,那么这个函数是如何获取字符串的长度的呢?

在这里插入图片描述

strlen会遍历整个字符数组,一直遇到’\0’结束

这个操作的时间复杂度是O(N),对于redis来说代价太大了

redis是怎么解决获取字符串长度的问题的?

在这里插入图片描述

可以看到,对于redis的字符串SDS,不单有保存字符串的数组空间,还有一些额外的成员

len,记录字符串长度,使得获取字符串长度的时间复杂度降到O(1)

2.缓冲区溢出

举个例⼦,strcat 函数是可以将两个字符串拼接在⼀起。

C 语⾔的字符串是不会记录⾃身的缓冲区⼤⼩的,所以 strcat 函数假定程序员在执⾏这个函数时,已经为 dest 分配了⾜够多的内存,可以容纳 src 字符串中的所有内容,⽽⼀旦这个假定不成⽴,就会发⽣缓冲区 溢出将可能会造成程序运⾏终⽌。

Q:redis是如何解决的?

A:SDS的alloc成员,分配给字符数组的空间⻓度。这样在修改字符串的时候,可以通过 alloc - len 计算出剩余的 空间⼤⼩,可以⽤来判断空间是否满⾜修改需求,如果不满⾜的话,就会⾃动将 SDS 的空间扩展⾄ 执⾏修改所需的⼤⼩,然后才执⾏实际的修改操作,所以使⽤ SDS 既不需要⼿动修改 SDS 的空间⼤ ⼩,也不会出现前⾯所说的缓冲区溢出的问题

3.不能保存二进制数据

这个很好理解,由于’\0’代表字符串结尾,会造成读入终止,这个限制使得 C 语⾔的字符串只能保存⽂本数据,不能保存像图⽚、⾳频、视频⽂化这 样的⼆进制数据

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot vue3 elementplus 景点评论数据分析与可视化系统源码

源码链接 系统演示:链接:https://pan.baidu.com/s/1J056R4rYji_mc4gwteZEzg?pwdnua4

关于Linux系统用户和用户组的使用

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

教程 | 在 Navicat 17 中管理连接

Navicat 17 提供了比以往更多的连接数据库实例的方式。除了传统的连接字符串方式以外,Navicat 17 还支持 URI 连接,无论身在何处,都可以轻松地通过 URI 访问对象。另外,还有一个新的管理连接功能,即允许你通过一个以用…

【LeetCode】39.组合总和

组合总和 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个…

高中数学:平面向量-常考题型汇总

一、数量积运算 例题1 解析 首先,为了化简运算过程,我们把OA、OB、OC向量记作a、b、c向量。 其次,充分利用已知条件,进行消元,两边平方,可以消除一个向量。 a → \mathop{a}\limits ^{\rightarrow} a→ *…

【简单探索微软Edge】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(Object Pascal中的泛型)

14.2 Object Pascal中的泛型 ​ 在前面的例子中,我们已经看到了如何在Object Pascal中定义和使用泛型类。我决定在深入讨论这个非常重要但又相当复杂的技术细节之前,通过一个例子来介绍泛型这一特性。在从语言角度讨论泛型之后,我们将列举更…

Hadoop文件存储格式

1. TextFile 默认格式,存储方式为行存储,数据不做压缩,磁盘开销大,数据解析开销大。可结合 Gzip、Bzip2 使用(系统自动检查,执行查询时自动解压),但使用 这种方式,压缩后的文件不支持 split&am…

2024.6.3总结1100

今天面试了一家广西电信公司,然后受到武汉华为的hr的电话沟通,如果没意外的话,下周就能收到offer了。 求职也算是踏入社会的第一步了,经过两个月的求职过程,我除了关于求职方面的技巧,也扩展了我的认知。 …

R语言安装caret包报错

R语言安装caret包报错:Error: package or namespace load failed for ‘caret’ in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck vI[[i]]): 不存在叫‘recipes’这个名字的程辑包 https://rbasics.org/packages/caret-package-in-r/ R版本的问题&…

商业新闻|你还在用传统搜索引擎吗?

‍‍今天是2024年第22周 这是Yura「输出倒逼输入」计划的第11篇文章 全年进度:11/52 01 AI搜索为什么没超过传统搜索? 生成式AI在搜索引擎领域掀起了一轮又一轮的波澜,但是一年多过去了,不管是必应还是perplexity都并没有动摇Goog…

深度解读GPT基本原理

GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的生成式预训练模型,其核心在于通过大规模无监督学习来捕捉语言知识和模式,并通过微调来适应各种下游任务。以下是GPT基本原理的详细解读: 1.Trans…

pandas习题 036:选择 DataFrame 的多个列

有以下一个 DataFrame,请从中选择 name 和 english 这两列形成一个 DataFrame。 import pandas as pddata {name: [Alice, Bob, Charlie, David, Eve],grade: [10, 11, 10, 12, 11],math: [90, 85, 92, 88, 95],english: [85, 92, 88, 90, 92],science: [92, 90, …

【TB作品】MSP430G2553霓虹灯呼吸灯跑马灯

霓虹灯: 跑马灯: 呼吸灯: 所有代码: 下载: https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2

苹果CMS:怎么添加2019和2020年份筛选

我们进入搜索的时候看到一个关于年份的搜索,那如果上面没有出现19,20我们该如何处理呢? 我们进入管理后台 -【系统】-【网站参数配置】-【预留参数】 添加下视频年代逗号隔开即可 如果要设置地区,语言也实在这里直接配置即可!&am…

毫米波雷达阵列天线设计综合1(MATLAB仿真)

1 天线设计目标 毫米波雷达探测目标的距离、速度和角度,其中距离和角度和天线设计相关性较强。天线增益越高,则根据雷达方程可知探测距离越远;天线波束越窄,则角度分辨率越高;天线副瓣/旁瓣越低,则干扰越少…

Kibana的使用

在学习elasticsearch时,可以使用Kibana自带的开发工具,来提高效率, 浏览器打开Kibana,在左侧菜单栏中找到Dev Tools 该工具提供代码提示和代码格式化功能,非常有用,

C++笔记(1)

1. C语言和C的区别? C语言作为一种过程性语言,侧重于通过算法描述来指导计算机执行,将复杂程序分解为简单、可管理的模块。 C语言支持模块化编程,每个模块作为独立的单元。C融合了3中不同的编程方式:C语言、面向对象…

【已解决】记录Vue2.x中npm install下载依赖报错:python2 Error: not found: python2问题(具体操作步骤)

项目场景: 项目场景:在项目开发中,升级了本地node版本后,重新npm install下载依赖报错找不到python环境 not found: python2 npm ERR! gyp verb check python checking for Python executable “python2” in the PATH 在尝试了各…

Codeforces Round 950 (Div. 3)(A~F2)

G题只会暴力..不会数据结构 A - 问题 Generator 暴力模拟即可 // Problem: A. Problem Generator // Contest: Codeforces - Codeforces Round 950 (Div. 3) // URL: https://codeforces.com/contest/1980/problem/A // Memory Limit: 256 MB // Time Limit: 1000 ms // //…