简单动态字符串SDS

news2025/1/16 20:18:47
  • 简单动态字符串(simple dynamic string):

    • redis虽然说是用C语言重写的,但它也进行了一些创新,自己构建了简单动态字符串SDS,从名字也看得出来有别于以空字符结尾的字符数组(C字符串)

    • reids中只有在一些无需对字符串修改的地方,才会去用C字符串。如一些日志的打印…

    • 而在一个可能被修改的字符串的时候,底层会去用SDS实现。如数据类型为字符串的key或value…

    • 此外,SDS还被用作缓冲区。如AOF缓冲区和客户端状态的输入缓冲区…

    • SDS的定义:

      • 用一个结构体来表示一个SDS值:

        struct sdshdr {
            //已使用的字节数量
            int len;
            //未使用的字节数量
            int free;
            //用来保存字符串的字节数组
            char buf[];
        }
        
      • SDS遵循了C语言字符串以空字符结尾的惯例,但保存空字符的一个字节不被len计算在内,所以这一字节对使用者来说就是透明的

      • 那么这么做的目的是什么? SDS可以直接重用一部分C字符串函数库的函数

    • SDS和C字符串的区别:

      1. 获取自身长度的时间复杂度:

        • SDS只需查len就知道自身长度,时间复杂度为O(1)
        • C字符串需要去遍历自身字节数组,时间复杂度为O(n)
        • 由此看,用SDS在查询自身长度时,性能得到了提高
      2. SDS可以杜绝缓冲区溢出的问题:

        • C字符串在一些拼接字符串的情况下,如果忘了检查剩余空间,可能会引起缓冲区溢出
        • 而SDS的API会在修改SDS时自动进行检查free和拓展等操作,所以SDS既方便又安全
      3. SDS减少了修改字符串带来的内存重分配次数:

        • C字符串的长度和底层数组长度之间存在一个字节的关联性,所以每次修改字符,都需要对数组进行一次内存重分配去拓展或释放空间

        • 内存分配涉及复杂的算法,并且可能需要执行系统调用,所以它通常比较耗时

        • SDS通过使用free解除了字符串长度和底层数组长度的关系,通过这个未使用空间,SDS实现了空间预分配和惰性空间释放两种优化策略,可以减少了修改字符串带来的内存重分配次数

          1. 空间预分配:用于优化SDS增长的操作,拓展空间不仅为SDS分配修改所需的空间,还会分配额外的未使用空间。

            1. 如果SDS修改后的长度(len)< 1MB(1MB等于1048576字节),那么程序将分配和len一样大的未使用空间。即len = x byte,free = x byte,buf数组有(2x + 1)byte长
            2. 如果SDS修改后的长度(len)>= 1MB,那么程序将分配和1MB的未使用空间。即len = 30MB, free = 1MB,buf数组有(31MB + 1byte)长
            3. 以上两种情况皆是基于free不足的条件,free如果多的很,那还分配个毛啊
            4. 空间预分配的意义:SDS将连续增长N次字符串所需的内存重分配次数从必定N次控制在最多N次
          2. 惰性空间释放:用于优化SDS缩短的操作,程序不立即使用内存重分配来回收缩短后多出来的字节,而是使用free将这些字节数量记录,等待将来使用

          • 与此同时,SDS提供了相应的API,让我们可以在有需要时,真正释放未使用的空间,不用担心此策略会造成内存浪费
          • 惰性空间释放的意义:SDS避免了缩短字符串时所需的内存重分配操作,并为将来的增长操作提供了优化
      4. SDS二进制安全

        • C字符串内部不能有空格,防止误认为是末尾,限制它只能保存文本数据,不能储存流媒体文件
        • SDS的API都是二进制安全的,,所有SDS API都会以处理二进制的方式处理SDS存放在buf数组里的数据,程序不会对其中的数据做任何限制、过滤、假设,数据在写入的时候是什么样子,读取的时候就是什么样子
        • 使用SDS保存内部空格的数据是没问题的,因为SDS是通过len来判断是否结束,而不是空字符
      5. SDS兼容部分C字符串函数(之前也谈到了SDS末尾也保留了空字符,只是没有纳入len,给放进buf字节数组了)

    • 总结:

      在这里插入图片描述

    • SDSAPI:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

谷歌AI助力软件工程的进展及未来展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【教学类-64-03】20240611色块眼力挑战(三)-2-10宫格色差10-50(10倍)适合中班幼儿园(星火讯飞)

背景需求&#xff1a; 【教学类-64-02】20240610色块眼力挑战&#xff08;二&#xff09;-2-25宫格&色差10-100&#xff08;10倍&#xff09;&#xff08;星火讯飞&#xff09;-CSDN博客文章浏览阅读360次&#xff0c;点赞17次&#xff0c;收藏13次。【教学类-64-02】2024…

34、matlab输入命令汇总

1、ans:最近计算的答案 代码示例1 12ans 3 代码示例2 Brand(7)B 列 1 至 60.7060 0.3171 0.1869 0.6797 0.5853 0.95930.0318 0.9502 0.4898 0.6551 0.2238 0.54720.2769 0.0344 0.4456 0.1626 0.7513 0.13860.0462 0.4387…

[大模型]GLM4-9B-chat Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架&#xff0c;对 LLaMA3-8B-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件&#xff0c…

python科研做图系列之时序图的绘制——对比折线图

参考知乎 折线图 我需要从两个不同的excel都读取第一列作为时间列,第二列作为编码列。 在同一张图上画出两条时间序列的折线图 横坐标是分钟,纵坐标是编码 帮我画的好看一些,记得解决中文乱码问题 英文版折线图 ,先搞个英文版,导师要求中文的话,再换成中文版 impor…

新技术前沿-2023-大模型学习根据个人数据集微调一个Transformer模型

参考如何根据自己的数据集微调一个 Transformer 模型 我们将通过NLP中最常见的文本分类任务来学习如何在自己的数据集上利用迁移学习(transfer learning)微调一个预训练的Transformer模型——DistilBERT。DistilBERT是BERT的一个衍生版本&#xff0c;它的优点在它的性能与BERT相…

区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现GRU-ABKDE门控循环单元自适应…

沐风老师3DMAX一键多孔结构建模插件Porous使用方法

​3DMAX一键多孔结构建模插件Porous使用教程 3dMax是大家熟知的3D建模软件之一&#xff0c;其功能非常的强大&#xff0c;在科研绘图领域有着非常广泛的应用&#xff0c;但是由于科研绘图的图形&#xff08;模型&#xff09;一般都属于异形结构&#xff0c;手工绘制建模&#x…

Docker | 入门:原理探究

Docker | 入门&#xff1a;原理探究 Run 的运行流程 Docker 底层原理 Docker 是怎么工作的&#xff1f; Docker 是一个 Client-Server 结构的系统&#xff0c;Docker 的守护进程运行在主机上&#xff0c;通过 Socket 从客户端访问。DockerServer 接受到 Docker-Client 的指令…

linux centos如何安装python3版本但不能影响默认python2版本

在CentOS上安装Python3而不影响系统默认的Python2,具有如何安装呢? 1. 更新系统包 首先,确保系统包是最新的: sudo yum update -y2. 安装EPEL存储库 EPEL(Extra Packages for Enterprise Linux)存储库包含许多额外的软件包,包括Python3: sudo yum install epel-rel…

Android Studio Jellyfish版本修改project使用特定jdk版本的步骤

android studio总是把这些东西改来改去让人十分恼火&#xff0c;IDE本身改来改去就让人无法上手就立即工作&#xff0c;很多时间浪费在IDE和gradle的配置和奇奇怪怪现象的斗智斗勇上&#xff0c;搞Android是真的有点浪费生命。一入此坑深不见底 jellyfish版安卓studio已经无法通…

[Vue3:axios]:实现登录跳转页面展示列表(查看教师所承担课程的学生选课情况)

文章目录 一&#xff1a;前置操作项目结构&#xff1a; 二&#xff1a;登录页面主要流程说明运行截图前端代码Login.vue 三&#xff1a;列表页面交互逻辑&#xff1a;涉及页面Page02.vue &#xff08;登录成功跳转学生选课页面&#xff09;运行截图 一&#xff1a;前置操作 ht…

【Linux】进程间通信之命名管道

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【PB案例学习笔记】-18制作一个IP地址编辑框

写在前面 这是PB案例学习笔记系列文章的第18篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

46-4 等级保护 - 网络安全等级保护概述

一、网络安全等级保护概述 原文:没有网络安全就没有国家安全 二、网络安全法 - 安全立法 中华人民共和国主席令 第五十三号 《中华人民共和国网络安全法》已于2016年11月7日由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过,并自2017年6月1日起正式…

LabVIEW图像采集处理项目中相机选择与应用

在LabVIEW图像采集处理项目中&#xff0c;选择合适的相机是确保项目成功的关键。本文将详细探讨相机选择时需要关注的参数、黑白相机与彩色相机的区别及其适用场合&#xff0c;帮助工程师和开发者做出明智的选择。 相机选择时需要关注的参数 1. 分辨率 定义&#xff1a;分辨率…

C++ - Clion安装Qt msvc2017版本教程,基础环境配置clion+ Qt5.12.12 msvc2017 + VS2019

背景&#xff1a;平时代码开发使用clion&#xff0c;但使用项目要制定mscv2017版本Qt。先装过mingw版本Qt无法运行&#xff0c;但msvc版本依赖装有Visual Studio&#xff0c;本地装的又是2019版。就出现了这个大坑&#xff0c;需要配置好clion Qt msvc2017 VS2019。 文章目录 …

立创EDA专业版设置位号居中并调整字体大小

选择某一个器件位号&#xff0c;右键->查找&#xff1a; 选择查找全部&#xff1a; 下面会显示查找结果&#xff1a; 查看&#xff0c;所有的位号都被选中了&#xff1a; 然后布局->属性位置&#xff1a; 属性位置选择中间&#xff1a; 然后位号就居中了 调整字体大小&a…

串口通信技术基础

1.0 串口通信基础 数据通信的两种常用形式&#xff1a; 1&#xff1a;并行通信 和 串行通信 并行方式&#xff1a;数据的各位使用多条数据线同时发送或同时接收 特点&#xff1a;传送速度快&#xff0c;但因需要多根传输线&#xff0c;曾经在近距离、高速率通信中使用 串行方式…

01——生产监控平台——WPF

生产监控平台—— 一、介绍 VS2022 .net core(net6版本&#xff09; 1、文件夹&#xff1a;MVVM /静态资源&#xff08;图片、字体等&#xff09; 、用户空间、资源字典等。 2、图片资源库&#xff1a; https://www.iconfont.cn/ ; 1.资源字典Dictionary 1、…