Redis设计与实现笔记之SDS

news2024/10/6 8:37:40

1 数据结构与对象

1.1 简单动态字符串

SDS简单动态字符串(simple dynamic string,SDS)是Redis中字符串的底层数据结构。

    struct sdshdr {
        // 记录 buf 数组中已使用字节的数量
        // 等于 SDS 所保存字符串的长度
        int len;
        // 记录 buf 数组中未使用字节的数量
        int free;
        // 字节数组,用于保存字符串
        char buf[];
    };

底层数据结构遵循C语言中空字符"\0"结尾。

数据结构三个属性分别代表存储字节的数组buf,数组中存储字符的长度len,数组空闲长度free

注意保存\0的字符串并不占用len的长度。并且会为\0空字符分配额外一字节空间。

遵循空字符结尾这一惯例的好处是, SDS 可以直接重用一部分 C 字符串函数库里面的函数。

以下是C语言中的字符数组与SDS的区别

1.1.1 获取字符串长度时间复杂度

SDS计算字符串长度的时间复杂度是O(1),C语言需要遍历数组计算长度时间复杂度为O(n)

1.1.2 缓冲区溢出

C语言中strcat的执行会导致缓冲区溢出。但SDS由于记录了字符串长度,sdscat在拼接字符串前会先检查SDS中的buf数组空间是否足够,不足的时候会先扩容buf,再执行拼接工作。

1.1.3 减少字符串修改时内存重分配次数

SDS中未使用空间可以减少字符串修改时,内存的重分配次数。

1.1.4 空间预分配

SDS被修改后,如果SDS的长度小于1MB,那么程序将分配len长度的空闲空间。例如len为20字节,那么同样分配20字节的free空间。

SDS被修改后,如果SDS的长度大于1MB,那么程序将分配1MB长度的free空闲空间。

1.1.5 惰性空间释放

SDS修改时,字符串的缩短并不减少buf实际长度,而是将增加字符串的free的长度。

但是SDS也提供真正缩短字符串的API

1.1.6 二进制安全

C语言中,字符数组不能包含空字符,会被识别为字符串结尾。因此C语言的字符数组只能保存文本数据。

但SDS中不对数据内容做限制,SDS存放的是二进制数据,因此SDS中叫buf为字节数组。SDS中通过len的参数来判断数据的结尾。而不是\0字符。这也保证了SDS的二进制安全

1.1.7 兼容部分c语言中的字符串函数

SDS也通过在数组最后存放\0字符来兼容C语言中的字符串函数。

例如:strcasecmp,strcat

C 字符串SDS
获取字符串长度的复杂度为

获取字符串长度的复杂度为

API 是不安全的,可能会造成缓冲区溢出。API 是安全的,不会造成缓冲区溢出。
修改字符串长度 N 次必然需要执行 N 次内存重分配。修改字符串长度 N 次最多需要执行 N 次内存重分配。
只能保存文本数据。可以保存文本或者二进制数据。
可以使用所有 <string.h> 库中的函数。可以使用一部分 <string.h> 库中的函数。

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

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

相关文章

房屋信息怎么做二维码?户型文件怎么批量转二维码?

现在很多房产开发商都会用二维码来储存各个楼每户的信息&#xff0c;可能是建筑平面图、验房信息、楼区信息等等。那么如果将每户信息导出单独的文件之后&#xff0c;怎样才能够将每个文件批量转成二维码呢&#xff1f;下面教大家使用二维码生成器&#xff08;免费在线二维码生…

pytorch快速入门中文——07(TensorBoard)

使用 TensorBoard 可视化模型&#xff0c;数据和训练 原文&#xff1a;https://pytorch.org/tutorials/intermediate/tensorboard_tutorial.html 在 60 分钟突击中&#xff0c;我们向您展示了如何加载数据&#xff0c;如何通过定义为nn.Module子类的模型提供数据&#xff0c;如…

HTTP协议、存储、Ajax

HTTP协议、存储、Ajax 前端数据交互与HTTP协议 前后端通信 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>初识前后端通信</title></head><body><script>// 1.前后端通信…

手术麻醉临床信息系统源码:实现手术全流程自动化和信息化

手术麻醉临床信息系统遵循“以病人为中心、服务于临床”的宗旨&#xff0c;使医护人员从繁琐的病历书写中解放出来&#xff0c;集中精力关注病人的诊疗&#xff0c;将更多的时间用于分析、诊断。以服务围术期临床业务工作的开展为核心&#xff0c;为医护人员、业务管理人员、院…

APP外包开发闪退解决工具

APP上线后出现闪退问题往往不好解决&#xff0c;解决这些问题耗时耗力&#xff0c;但解决好了会对用户体验有非常大的帮助。今天和大家分享解决APP闪退问题的一般流程&#xff0c;但具体情况可能会因为问题的复杂性和具体情况有所不同。北京木奇移动技术有限公司&#xff0c;专…

机器学习李宏毅学习笔记34

文章目录 前言一、Knowledge distillation二、Parameter quantization三、Architecture design四、Dynamic computation总结 前言 神经网络压缩&#xff08;二&#xff09;其他方法 一、Knowledge distillation 先train一个大的network叫做teacher network&#xff0c;小的ne…

Java微服务金融项目智牛股-基础知识二(Sentinel简介)

Sentinel 背景 微服务架构设计由众多为服务组成&#xff0c;为保障高可用&#xff0c;通常会采用集群方式部署。由于服务自身原因或网络等其他问题&#xff0c;并不能保证100%可用性&#xff0c; 若单个服务出现问题&#xff0c; 会导致进入该服务的线程阻塞&#xff0c; 如果…

【Linux】操作系统的基本概念 {冯诺依曼体系结构,操作系统的基本概念,系统调用及用户操作接口,shell程序}

一、冯诺依曼体系结构 现代计算机设计大都遵守冯诺依曼体系结构&#xff1a; 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一个个的硬件组件组成 输入单元&#xff1a;包括键盘, 鼠标&#xff0c;扫描仪, 磁盘&#xff0c;网卡等 存储器&#xff1a;内存&#…

cuda 安装(windows)简单

除了在linux上用&#xff0c;部分初学者也会在windows上用 需要在linux上安装的参考这篇&#xff1a;cuda linux安装 有的教程讲的很复杂&#xff0c;起始很简单 1.下载Cuda Toolkit&#xff08;全家桶&#xff09; cuda-toolkit官方页面 找到需要的版本 2.安装 双击然后下…

MySQL MHA高可用集群部署及故障切换

MySQL MHA高可用集群部署及故障切换 一、MHA概述二、MHA的组成三、MHA的特点四、MHA的原理五、搭建MySQLMHA1、所有服务器&#xff0c;关闭系统防火墙和安全机制2、修改 master&#xff08;192.168.92.11&#xff09;、Slave1&#xff08;192.168.92.12&#xff09;、Slave2&am…

使用Gradio创建交互式复选框组件

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Web (27号培训)

Get_POST Upload1 最后蚁剑链接寻找文件即可 简单的登录 用给好的字典爆破就好了 这仅仅只是爆破吗&#xff1f; 账户hacker 密码123456 1.爆破hacker帐号的密码 2.登录hacker帐号 3.抓包后将user改成vvvlllll&#xff0c;放包 4.即得flag

今日份分享:转换音频格式的软件有哪些

曾经有一位音乐爱好者&#xff0c;名叫张丽。她热爱收集高质量的音乐&#xff0c;尤其钟爱flac这种无损音频格式。然而&#xff0c;有一天&#xff0c;她遇到了一个问题&#xff1a;她的音乐播放器不支持flac格式&#xff0c;因此她迫切需要找到一种软件来转换flac音频格式。那…

助你丝滑过度到 Vue3 初识 ②②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…

读发布!设计与部署稳定的分布式系统(第2版)笔记15_快速失败和替换

1. 快速失败而非缓慢响应 1.1. 如果响应缓慢比没有响应更糟&#xff0c;那么最坏的情况肯定是缓慢的失败响应 1.2. 如果系统能够预先确定某次调用会失败&#xff0c;那么最好快速失败 2. 快速失败模式通过避免响应缓慢来提高整个系统的稳定性 2.1. 当系统由于部分失效而面临…

【pytorch,onnx,bug解决】pytorch的op:pixel unshuffle转到onnx的op:SpaceToDepth

文章目录 问题1&#xff0c; 转换失败问题1解决问题2&#xff0c;精度对不上问题2解决训练时转换时 问题1&#xff0c; 转换失败 pytorch训练好的模型想要在onnx上部署&#xff0c;但是发现算子F.pixel_unshuffle 不能直接转到onnx 的 SpaceToDepth&#xff0c; 发生以下报错&…

Android——基本控件(下)(十六)

1. 随笔提示文本&#xff1a;AutoCompleteTextView 1.1 知识点 &#xff08;1&#xff09;了解随笔提示功能的应用&#xff1b; &#xff08;2&#xff09;可以使用AutoCompleteTextView类完成随笔提示功能的实现。 1.2 具体内容 这个组件就是提供了一个文本输入的功能&…

YOLO改进教程:6.添加NAM-Net注意力机制

论文地址:https://arxiv.org/abs/2111.12419Github:https://github.com/Christian-lyc/NAM如果你是深度学习小白,阅读本文前建议先学习一下 📖《新手入门深度学习》如果你有一定基础,但是缺乏实战经验,可通过 📖《深度学习100例》 补齐基础另外,我们正在通过 🔥365…

window11系统打开VMware虚拟机,导致主机直接重启

问题描述&#xff1a; window11系统打开VMware虚拟机&#xff0c;直接导致主机直接重启 原因&#xff1a; 未开启“虚拟机平台”选项。 解决方式&#xff1a; 打开电脑“控制面板”&#xff0c;选择“程序”&#xff0c;在再选择程序中的“启用或关闭windows功能” 控制面板➡…

MyBatis 执行流程详解及示例代码

导言&#xff1a; MyBatis 是一个优秀的持久层框架&#xff0c;它简化了数据库操作的开发过程。本文将详细介绍 MyBatis 的执行流程&#xff0c;并提供相应的示例代码&#xff0c;帮助读者更好地理解和应用 MyBatis。 1. 创建 SqlSessionFactoryBuilder 对象 在 MyBatis 中&…