Redis之SDS底层原理解读

news2025/1/12 6:56:22

目录

SDS是什么? 

SDS结构示例

概述 

空间预分配

惰性空间释放

C字符串跟SDS的区别?为什么用SDS?


SDS是什么? 

Redis 底层的程序语言是由 C 语言编写的,C 语言默认字符串则是以空字符结尾的字符数组(简称 C 字符串)。但 Redis 默认的字符串并非 C 字符串,而是名为 SDS ( Simple Dynamic String )简单动态字符串的抽象结构。

  • 在 Redis 里面, C 字符串只会作为字符串字面量(string literal), 用在一些无须对字符串值进行修改的地方, 比如打印日志。
  • 当 Redis 需要的不仅仅是一个字符串字面量, 而是一个可以被修改的字符串值时, Redis 就会使用 SDS 来表示字符串值: 比如在 Redis 的数据库里面, 包含字符串值的键值对在底层都是由 SDS 实现的。

SDS结构示例

概述 

Redis 采用一段连续的内存空间来存储 SDS 结构,具体结构如下图所示,free 代表指这个字符串剩余可用空间的长度,而 len 代表这个字符串已占用空间的长度,buf [] 就是字符数组。

struct sdshdr {

    // 记录 buf 数组中已使用字节的数量
    // 等于 SDS 所保存字符串的长度
    int len;

    // 记录 buf 数组中未使用字节的数量
    int free;

    // 字节数组,用于保存字符串
    char buf[];

};

一个字符串为 'Redis' 在 SDS 结构中的存储例子:

图中 SDS 保留了 C 字符串以空字符结尾的传统,但这个空字符的长度1字节空间并不会计算在 SDS 的 len 属性里面,而是为这个空字符分配额外的1字节空间,每次由 SDS 相关函数默认添加到字符串末尾,Redis 这样设计的好处是 SDS 可以直接重用一部分 C 字符串相关函数。 

这个 SDS 结构为字符串 'Redis' 分配了5字节的已使用长度,也为其分配了5字节的可用空间长度。

空间预分配

SDS 通过未使用空间解除了字符串长度和底层数组长度之间的关联: 在 SDS 中, buf 数组的长度不一定就是字符数量加一, 数组里面可以包含未使用的字节, 而这些字节的数量就由 SDS 的 free 属性记录。 

空间预分配用于优化 SDS 的字符串增长操作: 当 SDS 的 API 对一个 SDS 进行修改, 并且需要对 SDS 进行空间扩展的时候, 程序不仅会为 SDS 分配修改所必须要的空间, 还会为 SDS 分配额外的未使用空间。通过空间预分配策略, Redis 可以减少连续执行字符串增长操作所需的内存重分配次数。

  • 如果对SDS进行修改之后,SDS的长度(也即是len属性的值)将小于1MB,那么程序分配和len属性同样大小的未使用空间,这时SDS len属性的值将和free属性的值相同。

进行修改之后, SDS 的 len 将变成 14 字节, 那么程序也会分配 14 字节的未使用空间, SDS 的 buf 数组的实际长度将变成 14 + 14 + 1 = 28字节(额外的一字节用于保存空字符)。

  • 如果对SDS进行修改之后,SDS的长度(也即是len属性的值)将大于等于1MB,那么程序会分配1MB的未使用空间。
     

进行修改之后, SDS 的 len 将变成 30 MB , 那么程序会分配 1 MB 的未使用空间, SDS 的 buf 数组的实际长度将为 30 MB + 1 MB + 1 byte 。

在扩展 SDS 空间之前, SDS API 会先检查未使用空间是否足够, 如果足够的话, API 就会直接使用未使用空间, 而无须执行内存重分配。

通过这种预分配策略, SDS 将连续增长 N 次字符串所需的内存重分配次数从必定 N 次降低为最多 N 次。

惰性空间释放

惰性空间释放用于优化 SDS 的字符串缩短操作: 当 SDS 的 API 需要缩短 SDS 保存的字符串时, 程序并不立即使用内存重分配来回收缩短后多出来的字节, 而是使用 free 属性将这些字节的数量记录起来, 并等待将来使用。

通过惰性空间释放策略, SDS 避免了缩短字符串时所需的内存重分配操作, 并为将来可能有的增长操作提供了优化。

C字符串跟SDS的区别?为什么用SDS?

C字符串SDS
字符串长度处理 len需要从头开始遍历,直到遇到“/0'为止时间复杂度O(N)记录当前字符串的长度,直接读取即可,时间复杂度 O(1)
内存重新分配alloc分配内存空间超过后,会导致数组下标越级或者内存分配溢出

空间预分配
SDS 修改后,len 长度小于 1M,那么将会额外分配与 len 相同长度的未使用空间。如果修改后长度大于 1M,那么将分配1M的使用空间。

惰性空间释放

有空间分配对应的就有空间释放。SDS 缩短时并不会回收多余的内存空间,而是使用 free 字段将多出来的空间记录下来。如果后续有变更操作,直接使用 free 中记录的空间,减少了内存的分配。

二进制安全buf二进制数据并不是规则的字符串格式可能会包含一些特殊的字符,比如“\0"等。C中字符串遇到“0会结束,那"\0"之后的数据就读取不上根据 len 长度来判断字符串结束的,二进制安全的问题就解决了

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

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

相关文章

品牌价格调查的方法

品牌做价格调查的目的,不是简单的对页面价或者挂牌售价进行调查,基本是需要对商品的到手价进行调查的,调查渠道中的实际成交价对品牌来说意义重大,因为知道到手价就可以了解产品是否存在低价,进而可以做针对性的低价打…

冠达管理:元宇宙三年行动计划发布,高增长潜力股名单出炉

未来5年,国内元国际商场规划至少打破2000亿元大关。 金融监管总局9月10日发布《关于优化保险公司偿付能力监管规范的告诉》,优化保险公司偿付能力监管规范,自发布之日起施行。 金融监管总局释放重要利好,引导保险资金更大力度地…

Ruff南潮物联邀请您参观中国工博会,快来扫码领取免费门票!

由于受疫情影响的延期,第23届中国国际工业博览会(简称"中国工博会")终于将要在2023年9月19日-23日国家会展中心(上海虹桥)举行。 中国工博会是由工业和信息化部、国家发展和改革委员会、科学技术部、商务部、…

教师节快乐!这条传承之路,我们走了十数年……

守初心,传匠心 这条路,我们走了十数年…… 在云和恩墨,有这样一群人,他们是技术和业务知识的传播布道者,乐知乐享,助人达己;他们在新人成长的道路上良苦用心,甘为人梯;他…

JTAG无法进入app的断点问题解决

通过JTAG口,可以对STM32进行在线调试,主要还是APP的调试,一般来说都是没有问题的。 但是,我这边碰到个奇怪现象: main 函数里面断点 死活进不去 官方demo程序也是一样现象 可以确定,App是正确写入到芯片的…

RBTree模拟实现

一、概念 概念:红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍&a…

【C#实战】控制台游戏 勇士斗恶龙(3)——营救公主以及结束界面

君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,最近开始正式的步入学习游戏开发的正轨,想要通过写博客的方式来分享自己学到的知识和经验,这就是开设本专栏的目的。希望…

pod 创建自定义库失败后解决方案

遇到以上问题: Cloning https://github.com/CocoaPods/pod-template.git into GlobalButton. Configuring GlobalButton template. Ignoring ffi-1.15.5 because its extensions are not built. Try: gem pristine ffi --version 1.15.5 /Library/Ruby/Site/2.6…

【校招VIP】前端计算机网络之webSocket相关

考点介绍 WebSocket 是一种网络通信协议,很多高级功能都需要它。初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为…

Codesys可以和西门子博途平分秋色吗?

当今工业自动化界,西门子博途似乎一直是硬件和软件开发的标配。但近年来,有一个名字越来越频繁地出现在各大PLC厂家的产品中:Codesys。此软件是否真的如传说中那样优秀?Codesys与西门子博途之间的竞争究竟如何呢?接下来…

电脑(win10系统) 每次开机都进入备份系统

解决方法,在系统设置里面将win10设置为默认的开机项。 1、winr 打开cmd,输入msconfig,打开系统配置--引导---选择win10系统----设为默认值----确定 2、点击电脑,右击属性,打开设置---高级系统设置-----高级 ------启动…

Swift 周报 第三十七期

文章目录 前言新闻和社区苹果跌近 3% 市值两天蒸发 1898 亿 美元iPhone 15 系列订单量下滑,苹果公司面临双重市场冲击苹果的对手回来了 提案通过的提案正在审查的提案驳回的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十七期&…

RTSP流媒体服务器EasyNVR安防视频云服务平台如何手动配置Onvif探测功能?

安防监控系统EasyNVR视频云存储平台可实现设备接入、实时直播、录像、检索与回放、视频云存储、视频分发等视频能力服务,可覆盖全终端平台(pc、手机、平板等终端),在智慧工厂、智慧工地、智慧社区、智慧校园等场景中有大量落地应用…

安装vCenter6.7出错 DNS服务原因

https://blog.csdn.net/seaship/article/details/107045006**A.VCSA6.7的安装**第1步,运行VCSA 6.7部署程序,中间一些截图参考何老师相关部署文章即可第2步,配置VCSA虚拟机网络,FQDN填写虚拟机分配的IP地址&#xff0c…

二分查找实例3(寻找旋转排序数组中的最小值)

题目: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋…

《论文阅读》常识感知的提示用于可控的同情对话生成 2023 AAAI

《论文阅读》常识感知的提示用于可控的同情对话生成 前言简介基础知识即插即用(Plug and Play)Future Discriminators(FUDGE)动机数据集方法前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望? 小白如何从零读懂论…

C#+sqlserver+asp.net婚纱影楼管理系统

一、源码描述 这是一款简洁十分美观的ASP.NETsqlserver源码,界面十分美观,功能也比较全面,比较适合 作为毕业设计、课程设计、使用,感兴趣的朋友可以下载看看哦 二、功能介绍 该源码功能十分的全面,具体介绍如下&…

企业如何加强合同风险控制?

企业运营的主要流程,不会因为企业人员规模或者业务规模大小的差异,而出现巨大的差异。 千万亿市值的上市公司、不足百人的新兴公司,面对的经营风险本质上不会有明显的区别。 那么,企业经营活动中,有哪些应对合同风险的…

从华为的C端产品服务体系看客户服务如何成为生产力

客户服务重要吗? 我想任何一个企业、企业家乃至员工都不会否认客户服务的重要性,但是实际上要转化为行动,就有难度了。不是所有的企业都能做到让客户服务为自己的品牌加分,甚至让客户服务成为开拓市场的利器。 一说到服务&#…

VA01/VA02/VA03/VA05 销售订单隐藏价格

1、业务需求 针对用户使用销售订单时,判断是否有权限,没有权限时隐藏销售订单抬头和行项目的价格相关字段 2、增强实现 2.1、隐藏抬头和行项目价格 隐藏抬头和行项目表格中的净值和净价字段 在程序MV45AFZZ→USEREXIT_FIELD_MODIFICATION中写隐式增强…