Redis 的 SDS 和 C 中字符串相比有什么优势?

C 语言使用了一个长度为 N+1 的字符数组来表示长度为 N 的字符串,并且字符数组最后一个元素总是 \0,这种简单的字符串表示方式 不符合 Redis 对字符串在安全性、效率以及功能方面的要求。

C语言的字符串可能有什么问题?
这样简单的数据结构可能会造成以下一些问题:

  • 获取字符串长度复杂度高 :因为 C 不保存数组的长度,每次都需要遍历一遍整个数组,时间复杂度为O(n);
  • 不能杜绝 缓冲区溢出/内存泄漏 的问题 : C字符串不记录自身长度带来的另外一个问题是容易造成缓存区溢出(buffer overflow),例如在字符串拼接的时候,新的
  • C 字符串 只能保存文本数据 → 因为 C 语言中的字符串必须符合某种编码(比如 ASCII),例如中间出现的 ‘\0’ 可能会被判定为提前结束的字符串而识别不了;

Redis如何解决?优势?

简单来说一下 Redis 如何解决的:

  1. 多增加 len 表示当前字符串的长度:这样就可以直接获取长度了,复杂度 O(1);
  2. 自动扩展空间:当 SDS 需要对字符串进行修改时,首先借助于 len 和 alloc 检查空间是否满足修改所需的要求,如果空间不够的话,SDS 会自动扩展空间,避免了像 C 字符串操作中的溢出情况;
  3. 有效降低内存分配次数:C 字符串在涉及增加或者清除操作时会改变底层数组的大小造成重新分配,SDS 使用了 空间预分配惰性空间释放 机制,简单理解就是每次在扩展时是成倍的多分配的,在缩容是也是先留着并不正式归还给 OS;
  4. 二进制安全:C 语言字符串只能保存 ascii 码,对于图片、音频等信息无法保存,SDS 是二进制安全的,写入什么读取就是什么,不做任何过滤和限制;

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

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

相关文章

Java程序员必知的9个SQL优化技巧

大多数的接口性能问题,很多情况下都是SQL问题,在工作中,我们也会定期对慢SQL进行优化,以提高接口性能。 这里总结一下常见的优化方向和策略。 1. 避免使用select *,减少查询字段 不要为了图省事,直接查询…

leetcode题目7

整数翻转 中等 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1&am…

别人家的UI表单为什么这么漂亮?而你却千篇一律。

设计漂亮的移动UI页面表单页需要考虑以下几个方面: 布局和结构设计 合适的布局和结构,使表单页面看起来整洁、清晰,并且易于使用。可以使用网格系统或者栅格布局来对表单进行划分,使不同的表单元素有明确的位置和排列。 色彩和配…

SQLite 命令

本章将向您讲解 SQLite 编程人员所使用的简单却有用的命令。这些命令被称为 SQLite 的点命令,这些命令的不同之处在于它们不以分号(;)结束。 让我们在命令提示符下键入一个简单的 sqlite3 命令,在 SQLite 命令提示符下&#xff0…

GO+树莓派+E53_IA1智慧农业模块

简介 之前手头上有小熊派的开发板, 有一个E53_IA1模块, 刚好用到树莓派上, 使用GO进行控制,实现智慧农业模块功能。 模块介绍 模块电路介绍 按硬件分成五块, 其中四块在本次用上了, 分别是 1. 补光模块&…

Docker nsenter 命令使用

查看容器对应宿主机上面的pid,容器技术的实质是进程,并没有完整的操作系统,就相当于在主机上面fork了一个子进程,通过docker daemon去fork一个子进程,这个子进程是可以在主机上面看到其pid的。 $ docker inspect -f {…

可视化大屏:城市治理方向,三维地图那是相当震撼呀。

随着城市化进程的加快,城市治理变得越来越复杂,需要大量的数据和信息来支持决策和管理。在这个背景下,可视化大屏作为一种新兴的信息展示工具,正逐渐在城市治理中发挥着重要作用。 首先,可视化大屏能够将庞大的数据和信…

kettle从入门到精通 第五十九课 ETL之kettle 邮件发送多个附件,使用正则轻松解决

想真正学习或者提升自己的ETL领域知识的朋友欢迎进群,一起学习,共同进步。若二维码失效,公众号后台加我微信入群,备注kettle。 问题场景: 一个朋友说他用kettle将生成好的多个文件(a.xls和b.xls&#xff0…

【LeetCode算法】1768. 交替合并字符串

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、题目二、思路三、解决方案 一、题目 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另…

代码随想录算法训练营第四十九天|123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

目录 123.买卖股票的最佳时机III思路代码 188.买卖股票的最佳时机IV思路代码 123.买卖股票的最佳时机III 题目链接:123.买卖股票的最佳时机III 文档讲解:代码随想录 视频讲解:动态规划,股票至多买卖两次,怎么求&#x…

图论专题训练

leecode 547 并查集 class Solution { public:int findCircleNum(vector<vector<int>>& isConnected) {ini();int len isConnected.size();for(int i0;i<len;i){for(int j0;j<len;j)if(isConnected[i][j]){unio(i,j);}}int ans 0;for(int i0;i<len;…

爱分析基于杭州云器Lakehouse实现成本最优的一体化管理,新一代数据平台的建设方式

导读 1.当前&#xff0c;企业在大数据和数据中台建设上取得成果&#xff0c;但数据开发管理仍具挑战性&#xff08;成本、效率、复杂度&#xff09;。 2.随数据平台领域成熟&#xff0c;厂商应结合自身需求&#xff0c;重新思考“基于开源自建数据平台”的重资产模式与“购买…

js: async/await

当你使用 async 关键字定义一个函数时&#xff0c;这个函数会返回一个 Promise。而当你在这个函数内部使用 await 关键字时&#xff0c;你实际上是在“等待”一个 Promise 的解决&#xff08;fulfilled&#xff09;或拒绝&#xff08;rejected&#xff09;。在等待期间&#xf…

Windows环境下编译 aom 源码详细过程

AV1 AV1是一种开源的视频编码格式&#xff0c;由开放媒体联盟&#xff08;AOMedia Video 1&#xff0c;简称AOMedia或AOM&#xff09;开发。AV1旨在提供比现有的视频编码格式如H.264和H.265更好的压缩效率&#xff0c;同时保持或提高视频质量。AV1的编码效率显著高于H.264&…

小猫咪邮件在线发送系统源码,支持添加附件

一款免登录发送邮件&#xff0c;支持发送附件&#xff0c;后台可添加邮箱,前台可选择发送邮箱 网站数据采取本地保存&#xff0c;所以使用前请给网站修改权限&#xff0c;否则很多功能将无法使用 安装教程&#xff1a; 1.上传服务器或者主机 2.登录后台&#xff0c;添加发送…

docker是干嘛的?

Docker是一个开源的平台&#xff0c;用于开发、交付和运行应用程序。它利用容器化技术&#xff0c;将应用程序及其依赖项打包到一个称为容器的可移植容器中。这使得应用程序能够在几乎任何环境中运行&#xff0c;而不受所运行的操作系统和硬件的限制。Docker的主要优点包括&…

MathType永久激活版写毕业论文必备神器以及破解版下载图文教程(附mathtype7镶嵌到word步骤)

前言 由于临近暑假&#xff0c;大学生和研究生都需要写自己的论文。使用的工具叫做MathType&#xff0c;它是加拿大的公司开发的&#xff0c;今天给大家带来的是Win和Mac版Mathtype最新破解版。 自从Mathtype7的发布&#xff0c;很多的老师和学生都不知道它从哪里下载和激活&…

测试萌新三天速通python基础(三)self参数,魔法方法,封装,继承,多态,json

python基础 类和对象⾯向对象代码的步骤类的设计 self 参数魔法⽅法初始化⽅法____init__________str_____ ⽅法 封装继承重写(override)多态对象 属性 方法静态方法文件⽂件操作打开⽂件的⽅式json ⽂件异常 类和对象 类: 是对具有相同特征或者⾏为的事物的⼀个统称, 是抽象的…

社区送水小程序软件开发

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

vue+springboot项目服务器部署

①创建一台opencloud8的腾讯云服务器 ②用xshell连接服务器 ③vue中新建.env.development配置文件 .env.development: VUE_APP_BASEURLhttp://localhost:9090 .env.production: VUE_APP_BASEURLhttp://服务器ip:9090 ④修改main.js import Vue from vue import App from ./A…