Redis-SDS 的定义

news2024/10/7 14:23:19

1.简介

Redis中的SDS(Simple Dynamic String,简单动态字符串)是一种专为Redis设计的字符串表示方式,旨在改进C语言中原生字符串的局限性。

2.SDS的核心结构

SDS结构不仅存储字符串的实际内容,还包括了额外的信息来优化字符串操作,如长度、未使用的缓冲区等。一个典型的SDS结构可能包含以下组件:

  • len:记录当前字符串的实际长度(字节数,不包括末尾的空字符)。
  • alloc:表示当前分配的总内存空间大小,包括已使用和未使用的部分。
  • buf:字符数组,用于存储字符串数据。

3.SDS的设计优势

  1. 空间预分配和惰性释放:当对SDS进行修改时,Redis会自动调整其内存分配策略,以减少频繁的内存重分配。例如,当字符串增长时,SDS不仅分配足够的空间存放新增数据,还会额外分配一些未使用的空间以应对未来的增长,从而减少扩容操作的频率。相反,当字符串缩短时,不会立即释放多余的空间,而是保留下来供后续可能的增长使用。
  2. 二进制安全:与C字符串不同,SDS可以直接存储二进制数据,因为它不依赖\0作为字符串结束标志,而是通过len字段来确定字符串的长度,这使得SDS能安全地处理包含\0的字符串。
  3. 兼容C字符串函数:尽管SDS是Redis特有的数据结构,但它设计得能够与C语言的标准字符串函数(如strlen())兼容,因为SDS头部的信息并不影响到字符串数据区的访问。
  4. 高效操作:由于直接存储了长度信息,SDS可以快速获取字符串长度(O(1)时间复杂度),并且在执行插入、删除等操作时,由于预分配和惰性释放机制,相比原生C字符串操作更加高效。

4.SDS 与 C 字符串的区别

1、长度信息

  • C字符串:不直接存储字符串长度,要获取长度需遍历整个字符串直到遇到\0终止符,时间复杂度为O(N)。
  • SDS:在结构体内显式存储字符串长度(len字段),可以O(1)时间复杂度获取长度,提高了效率。

2、空间分配

  • C字符串:通常按需分配刚好足够的空间,修改时可能频繁触发内存重分配。
  • SDS:采用空间预分配和惰性释放策略,减少内存重分配次数。当字符串增长时,预先分配额外空间;缩短时,不立即回收多余空间,留作将来使用。

3、安全性

  • C字符串:没有内置保护措施,不记录自身长度,容易因未检查边界造成缓冲区溢出。
  • SDS:通过记录长度和空闲空间,避免了缓冲区溢出问题,提供了安全的API接口。

4、二进制安全

  • C字符串:以\0作为字符串结束标志,不能直接存储包含\0的二进制数据
  • SDS:不依赖\0作为结束标志,而是通过len字段判断字符串结束,因此可以安全存储二进制数据。

5、兼容性与效率

  • C字符串:与C标准库兼容,广泛支持各种库函数,但在某些操作上效率较低。
  • SDS:虽然自定义,但设计上能与C字符串函数兼容,同时优化了字符串操作的性能。

6、扩展性

  • C字符串:功能较为基础,主要依赖标准库提供的字符串处理函数。
  • SDS:作为Redis的一部分,提供了更丰富的功能和更高的灵活性,支持Redis数据结构的高效实现。

SDS设计的初衷是为了克服C语言原生字符串在性能、安全性和扩展性上的不足,特别适合于Redis这样的高性能数据库系统中对字符串的操作需求。

5.应用场景

SDS广泛应用于Redis的各种数据结构中,如键值对、列表、集合、哈希表和有序集合等,作为基础的字符串存储单元,支撑着Redis的高性能数据处理能力。

 关注公众号:小黄学编程 回复:架构师 获取小黄收集的架构师资料

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

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

相关文章

达梦数据库的配置与安装

1. 下载压缩包,点击链接产品下载 | 达梦数据库 (dameng.com) 本人只是测试需要,所以选择的是开发版(X86平台) 2. 解压压缩包 3.点击iso的应用 4.选择挂载 这个是因为我有装挂载软件,如果没有装,麻烦搜索下…

基于Raspi的Opencv-Python开发笔记

本文所有未强调 “windows终端” 的 “终端”字眼,都是默认树莓派的终端 系统版本 系统版本有必要强调一下,因为不同版本很多操作需要修改 在终端输入uname -a Release就是版本号,Codename是版本名 以下操作仅在此版本验证可行 使能摄像…

解决找不到api-ms-win-crt-runtime-l1-1-0.dll问题的5种方法

电脑已经成为我们生活和工作中不可或缺的工具,然而,由于各种原因,我们可能会遇到一些常见的问题,其中之一就是电脑缺失api-ms-win-crt-runtime-l1-1-0.dll文件。这个问题可能会导致电脑出现错误提示、程序无法正常运行等困扰。为了…

Zookeeper复习

一、入门 1、概念 zookeeper文件系统通知机制 2.特点 1)、一个领导者,多个跟随者组成的集群。 2)、集群中只要有半数以上存活机制,zookeeper集群能正产服务。zk适合安装奇数台。 3)、全局数据一致:每…

一次 K8s 故障诊断:从 CPU 高负载到存储挂载泄露根源揭示

一、背景 现代软件部署中,容器技术已成为不可或缺的一环,在云计算和微服务架构中发挥着核心作用。随着容器化应用的普及,确保容器环境的可靠性成为了一个至关重要的任务。这就是容器SRE(Site Reliability Engineering&#xff0c…

【强烈推荐】四元数与三维旋转

目录 1 强烈推荐讲解四元数与三维旋转的这篇文章,深入浅出2 笔记2.1 复数2.1.1 复数的定义2.1.2 复数的乘法与二维旋转 2.2 三维空间中的旋转2.2.1 角轴2.2.2 旋转的分解 2.3 四元数2.3.1 四元数的定义2.3.2 四元数的乘法2.3.3 四元数与三维旋转2.3.4 三维旋转的矩阵…

【Excel】Excel中将日期格式转换为文本格式,并按日期显示。

【问题需求】 在使用excel进行数据导入的过程中, 有的软件要求日期列必须是文本格式。 但是直接将日期列的格式改为文本后,显示一串数字,而不按日期显示。 进而无法导入使用。 【解决方法】 使用【TXET】函数公式进行处理, 在单…

转转回收业务策略中心的实践

1 背景 回收业务发展日益壮大,我们在邮寄、上门、门店三大履约模式下的业务逻辑日益复杂。同样都是在做回收这一个业务,即便履约方式不同,也有很多业务概念是一致的。为了避免各个业务闷头造轮子,同时又能拉齐三端的业务标准&…

数据库(19)——字符串函数

函数是指一段可以直接被另一段程序调用的程序代码。 常用的函数 函数功能CONCAT(S1,S2...Sn)字符串拼接LOWER(str)将字符串全部转换为小写UPPER(str)将字符串全部转换为大写LPAD(str,n,pad) 用字符串pad对str的左边进行填充RPAD(str,n,pad)用字符串…

这款国内版Bookstack平替也很好用

对于企业、团队或个人来说,一个高效、易用的知识库系统就是提升工作效率和团队协作的利器。一款国内版的BookStack平替——HelpLook AI知识库,它不仅功能强大,而且操作简单,对于国内使用者来说刚刚好,跟着LookLook同学…

DP读书:《ModelArts人工智能应用开发指南》(一)人工智能技术、应用平台

怎么用ModelArts人工智能应用 训练底座训练案例 盘古矿山模型Main config.py 训练底座 训练案例 盘古矿山模型 Main 下面是快速助手 https://support.huaweicloud.com/qs-modelarts/modelarts_06_0006.html 准备开发环境 在ModelArts控制台的“ 开发环境 > Notebook”页面…

项目部署服务器--浏览器拒绝访问问题

一、检查自己的环境 是本地环境、还是虚拟环境 当您使用 Gunicorn 启动 Flask 应用并监听 0.0.0.0:5000 时,您的 Flask 应用已经可以在服务器上运行并通过该端口提供服务了。但是,0.0.0.0 是一个特殊的 IP 地址,它表示“所有可用的网络接口”…

数仓建模—指标体系指标拆解和选取

数仓建模—指标拆解和选取 第一节指标体系初识介绍了什么是指标体系 第二节指标体系分类分级和评价管理介绍了指标体系管理相关的,也就是指标体系的分级分类 这一节我们看一下指标体系的拆解和指标选取,这里我们先说指标选取,其实在整个企业的数字化建设过程中我们其实最…

Unity3d使用3D WebView for Windows and macOS打开全景网页(720云)操作问题记录

问题描述 使用Unity3d内嵌网页的形式打开720云中的全景图这个功能,使用的是3D WebView for Windows and macOS插件,720云的全景图在浏览器上的操作是滑动鼠标滚轮推远/拉近全景图,鼠标左键拖拽网页可以旋转全景图内容。网页的打开过程是正常…

右键Open with VSCode打开Vue3项目

之前看到一些同事能够对项目根目录进行右键打开项目到 Microsoft VS Code ,当时觉得挺不错的,于是乎今天自己折腾了一遍。 目录 1、创建vue3项目 2、更改注册表 # 打开注册表编辑器(Registry Editor) # 导航到以下注册表路径 …

揭秘c语言储存类别

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文将整理c语言的储存类型的知识点 储存类型概念 描述:用于解决内存开辟与解放的时间的问题。跟作用域没啥关系。 但是呢,他也是能影响到程序的运行的,所以是很关键的。 类型: auto :自…

8款监控电脑屏幕的软件排名(屏幕监控软件TOP8)

8款监控电脑屏幕的软件排名(屏幕监控软件TOP8) 作为企业管理者都想对企业的员工和电脑设备了如指掌,毕竟日防夜防家贼难防,利用电脑泄密者数不胜数,为此需要对电脑屏幕实施监控,小编为你推荐几个屏幕监控软…

WPS的JSA算国产编程语言,IDE,脚本工具吗?javascript代替VBA

现在wps用javascript代替VBA,应该算很成功了吧。 如果可以独立出来变成一个脚本语言,简单的IDE(本身也有类似VBA,不要寄宿在WPS里面运行,这样就可以变成VBS一样执行脚本了,用来开发按键精灵,LUA一样的脚本很不错 以下…

k8s练习--StorageClass详细解释与应用

文章目录 前言StorageClass是什么 一、实验目的配置过程 二、实验环境实验步骤一、配置网络存储NFS:1.主机基础配置2.配置 NFS: 二、开启rbac权限:三、创建nfs-deployment.yaml四、创建storageclass资源五、验证:1.创建PVC验证2.创建一个pod验…

RabbitMQ怎么保证可靠性

RabbitMQ怎么保证可靠性 前言生产端问题解决方案代码验证 RabbitMQ问题消费端问题解决方案代码验证 总结 前言 RabbitMQ相信大家都非常熟悉了,今天咱们来聊聊怎么保证RabbitMQ的可靠性。 那什么时候会出现问题呢? 第一种是生产端出现的问题。我们向队…