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

教程 | 在 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博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

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…

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

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

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

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

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

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

Kibana的使用

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

【已解决】记录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 // //…

哈夫曼树的构造,哈夫曼树的存在意义--求哈夫曼编码

一:哈夫曼树的构造 ①权值,带权路径长度。 ②一组确定权值的叶子节点可以构造多个不同的二叉树,但是带权路径长度min的是哈夫曼树 ③算法基本思想及其实操图片演示 注:存储结构和伪代码 1 初始化: 构造2n-1棵只有一个根节点的二叉树,parent=rchild=lchild=-1; 其中…

谷歌创新框架:从非结构化数据,实现多模态学习

看、听、说的多模态已成为主流大模型的重要功能之一。但在数据爆炸时代,大模型学习文本类的结构化数据相对还好一些,但要去学习视频、音频、图片等非结构化数据非常困难。 目前,从结构化和非结构化数据实现多模态学习,会随着模态…

QT_UI设计

mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE //命名空间 namespace Ui { class MainWindow; } //ui_MainWindow文件里定义的类&#xff0c;外部声明 QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_O…

httprunner接口自动化测试框架使用说明【保姆级教程】

背景介绍&#xff1a; httprunner是国内开源的一个接口自动化框架&#xff0c;已经有部分公司开始使用这种框架来完成自己公司的接口自动化编写&#xff0c;本文主要是从简单的流程上去讲解咋使用的&#xff08;PS&#xff1a;开发者本尊的官网教程写的是真的烂。。。&#xf…

JVM调优实战

如果老年代能回收掉大部分&#xff0c;说明年轻代太小了&#xff0c;放不下 OOM 1数据量一次性申请的内存过多&#xff0c;比如数据库查询返回值大多&#xff0c;所以做个分页 2.并发过高的情况下&#xff0c;一些连接未释放 3.堆内存不够

DP-Kmaens密度峰值聚类算法

我有个问题 关于 [密度值>密度阈值] 的判定这里&#xff0c;新进来的新数据怎么确定他的密度值&#xff1f;密度阈值又是怎样确定的呢&#xff1f;

Vscode git 插件

超好用的git记录 软件 安装之后&#xff0c;鼠标在哪一行就可以看最新一次是谁提交的&#xff0c;真的超好用&#xff01;&#xff01;&#xff01;