Redis篇-11--数据结构篇3--字符串内存模型(简单动态字符串SDS)

news/2024/12/19 16:59:06/

Redis 5 中的基础数据类型包括字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)。每种数据类型的底层结构和优化机制都经过了精心设计,以确保在不同场景下的高效性能。
主要概括如下:
在这里插入图片描述
本篇介绍下字符串的内存模型结构。

字符串(String)

1、SDS(简单动态字符串)

SDS (Simple Dynamic String):Redis使用自己的动态字符串SDS(简单动态字符串)来存储字符串数据。与 C 语言中的传统字符串不同,SDS提供了更高效的内存管理和操作。

  • 预分配空间:当字符串增长时,Redis会预先分配额外的空间,减少频繁的内存重分配。
  • 惰性释放:当字符串缩短时,Redis不会立即回收多余的空间,而是保留下来用于后续可能的增长。
  • 二进制安全:SDS是二进制安全的,可以存储任意数据,而不仅仅是文本。

2、SDS与C语言字符串对比

C语言有处理字符串方法的。而Redis就是C语言实现的,那为什么还搞一个SDS出来呢?我们从以下几点来看:

(1)、字符串长度处理

在这里插入图片描述

  • C语言的字符串存储方式如上图,想要获取字符串Redis的长度,需要从头开始遍历,直到遇到’\0’为止。

在这里插入图片描述
如上图,Redis在存储字符串时,是采用SDS(简单动态字符串)实现,其主要结构包含free、len、buf[]三个部分。

  • free记录空闲空间的长度。
  • len记录字符串长度(即buf中使用空间的长度)。
  • buf[]存储实际的字符串内容
    所以在Redis在存储字符串后,就已经记录了字符串的长度。当想要获取字符串长度时,只需要获取len即可,而无需在遍历字符串计算。前者遍历的时间复杂度为 O(n),Redis中O(1)就能拿到,速度明显提升。
(2)、内存重新分配

1、C语言中,修改字符串的时候会重新分配内存。修改地越频繁,内存分配也就越频繁。而内存分配是会消耗性能的,那么性能必然会下降。
2、Redis中实现了对字符串扩容的两种优化策略:(SDS这里可简单理解为字符串)
(1)、空间预分配

  • 对SDS修改及空间扩充时,除了分配所必须的空间外,还会额外分配未使用的空间。
  • 具体分配规则:SDS修改后,len长度小于1M,那么将会额外分配与len相同长度的未使用空间。如果修改后长度大于1M,那么将分配1M的额外使用空间。但需要注意的是字符串最大长度为 512M;

(2)、惰性空间释放
当然,有空间分配对应的就有空间释放。

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

(3)、二进制安全
Redis可以存储各种数据类型,那么二进制数据肯定也不例外。但二进制数据并不是规则的字符串格式,可能会包含一些特殊的字符,比如’\0’等。
说明:
在 C 语言中,传统的字符串是以空字符\0作为终止符的。这意味着如果你要存储包含\0的二进制数据(例如图像、音频文件等),C 语言的字符串处理函数会错误地认为遇到\0就是字符串的结束,从而导致数据截断或解析错误。
SDS不依赖空字符\0来表示字符串的结束,会保存下全部的数据。相反,SDS使用len字段来记录字符串的实际长度,计算时不会因为遇到\0结束,会走到最后统计长度。无论buf中是否包含\0,SDS都可以通过len准确地知道字符串的长度,而不会误将\0作为字符串的结束标志。
因此,SDS 可以安全地存储和处理任意的二进制数据,而不会因为数据中包含\0而出现问题。

学海无涯苦作舟!!!


http://www.ppmy.cn/news/1556432.html

相关文章

HTTP 协议报文结构 | 返回状态码详解

注:本文为 “HTTP 历史 | 协议报文结构 | 返回状态码” 相关文章合辑。 未整理去重。 HTTP 历史 wangjunliang 最后更新: 2024/3/16 上午10:29 超文本传输协议(英语:HyperTextTransferProtocol,缩写:HTTP)是 万维网(World Wide Web)的基础协议。自 蒂姆…

gitlab代码推送

点击这个√ 修改的文件全部选上 填好提交的名称 点击commit 选取提交的 gitlab 库 点击Push

芯片级IO (Pad) Ring IP Checklist

SoC top顶层数字后端实现都会涉及到IO Ring (PAD Ring)的设计。这里面包括VDD IO,VDDIO IO, Signal IO, Corner IO,Filler IO,IO power cut cell等等。 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字IC后端实现TOP F…

BigBlueButton有哪些优点和缺点

BigBlueButton有哪些优点和缺点 作者:BBBEasy中国区团队,Github地址:https://github.com/lihaiya/bbbeasy BigBlueButton作为一个开源的在线会议和协作平台,在教育、企业等多个领域得到了广泛应用。以下是BigBlueButton的优点和…

如何部署和配置项目管理工具 Plane - 开源 Jira 替代方案

简介 Plane 是一个高度可扩展的开源项目管理工具,支持多种框架类型,如敏捷、看板、瀑布和时间线。它是 Jira、Asana 和 Linear 等平台的替代方案,允许您使用 Docker 或 Kubernetes 等工具在容器化环境中自托管所有应用程序资源。 本指南将介…

Vue.js前端框架教程5:Vue数据拷贝和数组函数

文章目录 Vue数组函数 filtermapreducelength使用示例Vue 拷贝展开运算符 (...)Object.assign()JSON.stringify() 和 JSON.parse()注意事项 Vue数组函数 在 Vue 中,处理列表时经常需要用到数组的内置方法,如 filter、map、reduce 以及检查数组长度的 le…

NSDT 3DConvert:高效实现大模型文件在线预览与转换

NSDT 3DConvert 作为一个 WebGL 展示平台,能够实现多种模型格式免费在线预览,并支持大于1GB的OBJ、STL、GLTF、点云等模型进行在线查看与交互,这在3D模型展示领域是一个相当强大的功能。 平台特点 多格式支持 NSDT 3DConvert兼容多种3D模型…

TCP 三次握手四次挥手

目录 TCP 三次握手四次挥手 一、TCP基础 二、TCP数据报结构 三、名词术语 四、TCP的三次握手 ✍️过 程描述: 举例说明: 总结: 思考 🤔 : 五、TCP的四次挥手 ✍️ 过 程描述: ☕️ 川 航图举例: 思考 🤔: TCP 三次握手四次挥手 一、TCP基础…