Redis底层数据结构 SDS

news/2024/11/4 23:47:59/文章来源:https://www.cnblogs.com/jock766/p/18526971

SDS

字符串在 Redis 中是很常用的,键值对中的键是字符串类型,值有时也是字符串类型。


Redis 是用 C 语言实现的,但是它没有直接使用 C 语言的 char* 字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simple dynamic string,SDS) 的数据结构来表示字符串,

也就是 Redis 的 String 数据类型的底层数据结构是 SDS。


既然 Redis 设计了 SDS 结构来表示字符串,肯定是 C 语言的 char* 字符数组存在一些缺陷。


C 语言字符串的缺陷


C 语言的字符串其实就是一个字符数组,即数组中每个元素是字符串中的一个字符。


比如,下图就是字符串“xiaolin”的 char* 字符数组的结构:


在 C 语言里,对字符串操作时,char * 指针只是指向字符数组的起始位置,而字符数组的结尾位置就用“\0”表示,意思是指字符串的结束。


因此,C 语言标准库中的字符串操作函数就通过判断字符是不是 “\0” 来决定要不要停止操作,如果当前字符不是 “\0” ,说明字符串还没结束,可以继续操作,如果当前字符是 “\0” 是则说明字符串结束了,就要停止操作。


举个例子,C 语言获取字符串长度的函数 strlen,就是通过字符数组中的每一个字符,并进行计数,等遇到字符为 “\0” 后,就会停止遍历,然后返回已经统计到的字符个数,即为字符串长度。下图显示了 strlen 函数的执行流程:


很明显,C 语言获取字符串长度的时间复杂度是 O(N)(这是一个可以改进的地方)


C 语言字符串用 “\0” 字符作为结尾标记有个缺陷。假设有个字符串中有个 “\0” 字符,这时在操作这个字符串时就会提早结束,比如 “xiao\0lin” 字符串,计算字符串长度的时候则会是 4,如下图:


因此,除了字符串的末尾之外,字符串里面不能含有 “\0” 字符,否则最先被程序读入的 “\0” 字符将被误认为是字符串结尾,这个限制使得 C 语言的字符串只能保存文本数据,

不能保存像图片、音频、视频文化这样的二进制数据(这也是一个可以改进的地方)

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

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

相关文章

PackageTracer实验中第一次Ping必然会丢包的原因

在packageTracer中做实验时发现首次ping位于不同网络中的主机时必然会超时,我对此疑惑不解,但是上网没有找到相关解答,于是我通过包跟踪找到了答案,于是将其记录下来,希望对后拉的读者有所帮助。PS:R0与R1的位置有误 PC1 Ping PC3 的过程首先,当我们在PC1发出Ping命令时…

easy-mock搭建mock平台

环境: mac 1、前提: 需要已安装node和npm(easy-mock是node.js开发的)、redis、mongodb 安装mongodb(mongodb很大,剩余内存需要10个G左右)$ brew install mongodb-atlas $ atlas setup2、安装easy-mockgit clone https://github.com/easy-mock/easy-mock.git #选择要把eas…

easy-mock搭建mock服务

环境: mac 1、前提: 需要已安装node和npm(easy-mock是node.js开发的)、redis、mongodb 安装mongodb(mongodb很大,剩余内存需要10个G左右)$ brew install mongodb-atlas $ atlas setup2、安装easy-mockgit clone https://github.com/easy-mock/easy-mock.git #选择要把eas…

[编程笔记] 奇怪的bug - 公共提示组件不生效

很简单的一个功能,初看的时候就猜到是用的某个组件,其他地方要用一般照抄,改下文案即可,这种弹出肯定是公共组件了。然鹅,很神奇的是我新做的页面,复制以后没效果!项目中有这么一个提示框:对应的代码是:top.msg.ok(123)很简单的一个功能,初看的时候就猜到是用的某个组…

linux内存管理学习总结

一、内存寻址 1.1 逻辑地址、线性地址、物理地址的概念 1.2 逻辑地址转换线性地址步骤 1.3 线性地址到物理地址的转换 二、内存管理 2.1 引导内存分配器阶段 2.2 内存管理子系统 2.3 32位架构的地址空间划分 2.4 64位架构的地址空间划分 2.5 内核态的内存管理 2.6 用户态内存管…

https页面加载http资源的解决方法

https页面加载http资源的解决方法@目录1.报错如图2.项目背景3.网上的解决方案4.我的最终解决方案 1.报错如图2.项目背景我们的项目采用的全是https请求,而使用第三方文件管理器go-fastdfs,该文件管理器返回的所有下载文件的请求全是http开头的,比如http://10.110.38.253:110…

Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载

Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载@目录一、业务背景二、实现思路二、准备工作1.准备data模板.xlsx2.引入poi相关依赖,用于操作excel3.针对WorkBook+ZIP压缩输入/输出流,相关方法知识点要有所了解三、完整的项目代码四、可能遇到的问题错误场景…

macOS 解锁隐藏文件

不知道为什么,我用 VS Code 编译的 LaTeX 文档是隐藏的,导致我复制到其他地方都看不见这个文档。首先可以按下 Command + Shift + . 组合键显示隐藏文件。接下来可以用下面的命令取消隐藏的文件: chflags nohidden <file>如果你想重新隐藏的话,使用下面的命令: chfl…

Spring原理Boot

Spring原理 SpringBoot 1 Boot 1.1 Boot 骨架项目 如果是 linux 环境,用以下命令即可获取 spring boot 的骨架 pom.xml curl -G https://start.spring.io/pom.xml -d dependencies=web,mysql,mybatis -o pom.xml也可以使用 Postman 等工具实现 若想获取更多用法,请参考 curl …

0xGame 2024 [Week 2] 报告哈基米

0xGame 2024 [Week 2] 报告哈基米 新知识:Tupper(塔珀自指公式);Arnold Cat(猫映射) 下载文件是一个png图片,010打开查看 发现是倒着的pk转一下保存为zip文件,打开后是一个txt文件有两个地方有提示,一个是十六进制里面的Maybe You Need To Kown Arnold Cat?还有一个是…

告别 PPT 配图难题!Napkin.ai 轻松打造生动演示文档(文末免费送书)

还在为 PPT 配图发愁?Napkin.ai 来救场!它是强大的文本自动配图工具,能自动摘要文本、生成并自定义配图,下载方式多样。文中详细介绍其使用方法,包括注册、创建 Napkin、选择和设置配图等。此外,还有免费送书活动,关注、留言点赞就有机会获得《OpenAI API 接口应用实战》…