Redis底层数据结构之SDS

目录

    • 一、概述
    • 二、SDS结构
    • 三、为什么使用SDS

下一篇 redis底层数据结构之ziplist

一、概述

Redis 中的 SDS(Simple Dynamic String,简单动态字符串)是 Redis 用于存储字符串值的底层实现,是对 C 语言传统字符串(以 null 结尾的字符数组)的改良,内部结构类似于 C 语言的字符数组,但额外存储了字符串长度和分配空间大小,避免了 C 字符串的缺陷。SDS 用于解决 C 字符串的一些限制和安全性问题, 具有动态扩容的特点. 其实现位于src/sds.hsrc/sds.c中。SDS 除了保存数据库中的字符串值以外,SDS 还可以作为缓冲区(buffer):包括 AOF 模块中的AOF缓冲区以及客户端状态中的输入缓冲区。

二、SDS结构

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

三、为什么使用SDS

  1. 长度灵活
    SDS 在内存中的表示包含了字符串的长度信息,因此它可以包含任意长度的数据,包括空字符(‘\0’)。这解决了 C 字符串无法存储空字符的问题。

  2. 快速获取长度
    由于 len 属性的存在,我们获取 SDS 字符串的长度只需要读取 len 属性,时间复杂度为 O(1)。而对于 C 语言,获取字符串的长度通常是经过遍历计数来实现的,时间复杂度为 O(n)。通过 strlen key 命令可以获取 key 的字符串长度。

  3. 防止缓冲区溢出
    在 C 语言中使用 strcat 函数来进行两个字符串的拼接,一旦没有分配足够长度的内存空间,就会造成缓冲区溢出。而对于 SDS 数据类型,在进行字符修改的时候,会首先根据记录的 len 属性检查内存空间是否满足需求, 如果不满足,会进行相应的空间扩展,然后在进行修改操作,所以不会出现缓冲区溢出。

  4. 减少修改字符串时的内存重新分配次数
    C语言由于不记录字符串的长度,所以如果要修改字符串,必须要重新分配内存(先释放再申请),因为如果没有重新分配,字符串长度增大时会造成内存缓冲区溢出,字符串长度减小时会造成内存泄露。而对于SDS,由于len属性和alloc属性的存在,对于修改字符串SDS实现了空间预分配和惰性空间释放两种策略:

    • 空间预分配:对字符串进行空间扩展的时候,扩展的内存比实际需要的多,这样可以减少连续执行字符串增长操作所需的内存重分配次数。
      • 如果对 SDS 进行修改之后, SDS 的长度(也即是 len 属性的值)将小于 1 MB , 那么程序分配和 len 属性同样大小的未使用空间, 这时 SDS len 属性的值将和 free 属性的值相同。 举个例子, 如果进行修改之后, SDS 的 len 将变成 13 字节, 那么程序也会分配 13 字节的未使用空间, SDS 的 buf 数组的实际长度将变成 13 + 13 + 1 = 27 字节(额外的一字节用于保存空字符)。
      • 如果对 SDS 进行修改之后, SDS 的长度将大于等于 1 MB , 那么程序会分配 1 MB 的未使用空间。 举个例子, 如果进行修改之后, SDS 的 len 将变成 30 MB , 那么程序会分配 1 MB 的未使用空间, SDS 的 buf 数组的实际长度将为 30 MB + 1 MB + 1 byte 。
    • 惰性空间释放:对字符串进行缩短操作时,程序不立即使用内存重新分配来回收缩短后多余的字节,而是使用 alloc 属性将这些字节的数量记录下来,等待后续使用。(当然SDS也提供了相应的API,当我们有需要时,也可以手动释放这些未使用的空间。)
  5. 二进制安全
    SDS 可以存储任何二进制数据,包括图片、音频等非文本数据。这是因为 SDS 不依赖 null 字符来标识字符串的结束,而是以 len 属性表示的长度来判断字符串是否结束,因此数据中可以包含任意的二进制序列。

  6. 兼容部分 C 字符串函数
    尽管 SDS 是对 C 字符串的扩展,但它的存储布局确保了在以 \0 结尾处的内存地址上的内容可以被视为一个正常的 C 字符串,这意味着可以在不需要复制字符串的前提下,利用 C 的一些标准库函数来操作 SDS。

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

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

相关文章

通过本机电脑远程访问路由器loopback的ip

实验拓扑图 本机电脑增加路由信息 正常设置telnet用户,然后通过本地电脑telnet 软件ensp中的设备,尝试是否可以正常访问即可 测试通过本地电脑可以正常访问ensp里面设备的loopback的ip地址了 最重要的一点是本机需要增加一条路由route add ip mask 下…

前端开发与html学习笔记

一、前端开发概述 前端开发:也叫做web前端开发,它指的是基于web的互联网产品的页面(也可叫界面)开发及功能开发互联网产品:指网站为满足用户需求而创建的用于运营的功能及服务,百度搜索、淘宝、QQ、微博、网易邮箱等都是互联网产…

Java基础之继承、多态、抽象类

Java基础 1.猜数字小游戏 import java.util.Random; import java.util.Scanner;public class MathTest {public static void main(String[] args) {// 猜数字小游戏//int randomValue (int) (Math.random() * 100 1); 随机产生[1,101)之间的整数Random random new Random(…

【Java】实现一个简单的线程池

📝个人主页:哈__ 期待您的关注 一、线程池的模式 线程池顾名思义就是管理线程的一个池子,我们把创建线程的过程交给线程池来处理,而这个线程池当中的线程都会从阻塞队列当中取获取任务执行。 我们不在直接把任务的创建过程写到…

民间故事传说(一)

秦始皇为了抵御外敌,修筑了一座伟大的工程,那就是长城。长城在现代看来是一项前无古人,后无来者的工程。和在古代却是劳民伤财,人声怨载的工程。为了修长城,老百姓的日子是苦不堪言,当兵的到处抓人&#xf…

mpu6050姿态解算与卡尔曼滤波(5)可应用于51单片机的卡尔曼滤波器

博客4中给出的滤波器状态维数为4维,测量量为3维,每次滤波需要做不少矩阵乘法和求逆运算。如果想在51单片机上实现,计算耗时会比较长。考虑应用场合可以对滤波器适当做一些简化,计算量会大大减小。 首先,陀螺和加速度计…

OracleDay01

ORACLE 简介 什么是 ORACLE ORACLE 数据库系统是美国 ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORA…

NLP预训练模型-GPT-3

ChatGPT GPT-3是OpenAI开发的一个自然语言处理(NLP)预训练模型。GPT代表“生成式预训练变换器”(Generative Pretrained Transformer)。GPT-3是GPT系列的第三代模型,是一种采用了深度学习技术的强大语言模型&#xff…

mapreduce中的ReduceTask工作机制(Hadoop)

ReduceTask 是 Hadoop 中的一个重要组件,负责对 MapTask 的输出进行合并、排序和归并,最终生成最终的输出结果。 ReduceTask 的工作机制 1. 分组(Shuffle)阶段: 在分组阶段,ReduceTask 会从多个 Mapper …

(救命)Kali Linux或者其他linux系统的触控板右键按下没反应,失效的解决办法

我每次安装kali的时候都会选择gnome桌面,每次安装好右键都是禁用的,按下和左键效果一样,每次都得去调鼠标右键,原来就不好找到那个选项,这次踏马居然连那个选项都没了,如果你去网上找教程你会发现网上根本没…

CX5120-0125倍福CPU模块维修PLC控制器CX5120全系列主机电脑深圳捷达工控维修

工业计算机服务与维修 为任何品牌的工业计算机、显示器、人机界面 (HMI) 和面板计算设备提供服务、维修和改造。您可以信赖我们延长生命周期,包括不再投放市场的产品。 工业计算机维修与保养 您的工业计算机专家 工业计算机维修服务 深圳捷达工控维修深知做好工业…

详解 C++ 实现K-means算法

一、K-means算法概述 K-means算法是一种非常经典的聚类算法,其主要目的是将数据点划分为K个集群,以使得每个数据点与其所属集群的中心点(质心)的平方距离之和最小。这种算法在数据挖掘、图像处理、模式识别等领域有着广泛的应用。 二、K-means算法的基本原理 K-means算法…

【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 Spring Boot 配置文件一. 配置文…

基于SpringBoot+Vue的幼儿园管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库:Mysql5.7/8.0 数据表:19张 开发语言:Java(jdk1.8) 开发工具:idea 前端技术:vue 后端技术:SpringBoot 功能简介 (有文档) 项目获取关键字&#…

Vue实现多角色登录,Vue-Router路由守卫控制权限页面

实现页面侧边栏和头部不变,当点击某个功能时,只有主体部分发生变化,这要用到子路由技术 我的项目结构如上,其中包含侧边栏和头部的文件是Manage.vue,主页面是Home.vue,个人页面是Person.vue,用户…

每日三个JAVA经典面试题(四十四)

1.什么是反应式编程?它如何优化Web应用的性能? 反应式编程是一种编程范式,它通过异步数据流的方式处理事件和数据,以实现高效的数据处理和事件驱动的程序设计。在反应式编程中,数据流可以被观察(Observabl…

固态硬盘数据都不能恢复吗?

固态硬盘的数据在某些特定情况下是可以被成功恢复的。 尽管固态硬盘的工作原理与机械硬盘不同,数据恢复方面相对困难,但并不意味着所有情况下都无法恢复数据。 例如,当固态硬盘发生逻辑损坏时,数据恢复的几率会相对较高。此外&am…

回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量…

二分答案算法

基本概念 将最值问题转换为判定 与二分查找的区别 二分查找:在一个已知的有序数据集上进行二分地查找 二分答案:答案有一个区间,在这个区间中二分,直到找到最优答案 如何判断一个题是不是用二分答案做的 1、答案在一个区间内…

【GIS面试】GIS算法介绍

作者:后端小肥肠 1. 前言 在地理信息系统(GIS)的领域中,算法扮演着极其重要的角色,它们使得复杂的空间数据分析成为可能。无论是在环境科学、城市规划,还是在灾害管理等众多领域,高效和精确的算…