IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis-字符串底层实现 -> 正文阅读

[大数据]Redis-字符串底层实现

概览

SDS 是 Redis 字符串底层实现的数据结构,全称 Simple-Dynamic-String 简单动态字符串,对 C 语言的字符串进行了增强,增强主要体现在效率和安全性方面。

定义

SDS数据结构如下,主要包含三个属性:字符串长度,空闲空间,字符数组


另外 SDS 遵守了C语言字符串以空字符结尾的惯例,这样做的原因是可以复用C语言库中部分字符串操作相关的函数。

常数复杂度获取字符串长度

由于 SDS 会维护 len 属性记录字符长度,不需要像 C语言字符串一样通过遍历字符串得到长度,因此在获取字符串长度上面SDS有着很高的效率,时间复杂度仅为O(1)。

避免缓冲区溢出

C语言中因字符串内容修改,使得字符串长度发生变更的时候,在内存分配的原则上是用多少,分配多少,而分配内存的操作需要用户自主完成,容易因为操作失误而导致缓冲区溢出问题,例如修改前忘记预分配内存,导致修改后的字符串内容溢出到了其它字符串上。

而 SDS 维护了 free 空闲空间字段,可以动态判断当前空闲空间是否足够容纳扩展后的字符串内容,如果空间不足,则会自动扩容,避免了缓存溢出的问题。

减少重分配次数

上面讲到,在内存空间不足时,SDS 会触发自动扩容,扩容机制如下:

  • 如果修改后的字符串长度 len < 1MB,则会分配与 len 同样大小的空闲空间,即 free = len,最终扩容后的总空间大小 = len + free + 1byte
  • 如果修改后的字符串长度 len >= 1MB,则会分配 1MB 的空闲空间,即 free = 1MB,最终扩容后的总空间大小 = len + 1MB + 1byte

通过空间预分配策略,SDS 可以减少连续执行字符串增长操作所需的内存重分配次数。

另外在字符串缩短的场景下,SDS 不会立即回收多出来的空闲空间,通过 free 属性将空闲空间记录下来,并等待将来使用。

通过惰性空间释放机制,SDS 能避免因字符串缩短操作导致的内存重分配,也为将来可能有的增长操作提供了基础。

与此同时,SDS也提供了相应的API,可以在有需要时真正地释放SDS的未使用空间。

二进制安全

C语言字符串以空字符作为字符串结 尾的标识,因此除尾部字符外,字符串中不能包含空字符,否则会导致字符串被提前截断。

这样使得C语言字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据。

而 SDS API都会以处理二进制的方式来处理存放在buf数组里的数据,程序不会对其中的数据做任何限制、过滤、或者假设,数据在写入时是什么样的,它被读取时就是什么样。

因此 SDS 也是二进制安全的,除了可以保存文本内容,也可以保存二进制数据。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:57:41  更:2022-03-21 21:01:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:56:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码