Redis系列之底层数据结构SDS

news2024/11/11 5:44:39

Redis系列之底层数据结构SDS

实验的环境

  • Redis 6.0
  • VSCode 1.88.1

什么是SDS?

SDS:Simple Dynamic String,翻译为简单动态字符串。SDS是一种用于存储二进制数据的数据结构,具有动态扩容的特点,代码位于src/sds.hsrc/sds.c

SDS的总体数据结构大致如图:在源码里sds包括几个部分,lenallocflagsbuf,其中 sdshdr是头部,buf是真实存储数据的地方,在存储的数据后面会跟一个\0,所以数据加上\0就是所谓的buf

在这里插入图片描述

  • len:保存了SDS字符串的长度
  • buf[]:保存数据的地方
  • alloc:分别以uint8, uint16, uint32, uint64表示整个SDS
  • flags:始终为一字节, 以低三位标示着头部的类型, 高5位未使用

查看源码sds.h,可以看到SDS里面有几种不同的头部,其中sdshdr5实际并未使用到,所以实际上有四种不同的头部

/* Note: sdshdr5 is never used, we just access the flags byte directly.
 * However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {
    unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len; /* used */
    uint8_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
    uint16_t len; /* used */
    uint16_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
    uint32_t len; /* used */
    uint32_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
    uint64_t len; /* used */
    uint64_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

为什么要使用SDS?

Redis是用C语言写的,为什么不直接就用C语言里的char来定义字符串?

  • 获取字符串长度

由于有len属性,所以获取SDS字符串的长度只需要读取len属性,所以时间复杂度为O(1)。如果直接使用C语言中的字符串来实现,获取字符串的长度需要遍历计数,时间复杂度为O(n)

  • 避免缓存区溢出

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

  • 减少字符串内存重新分配次数

C语言中字符串,是不会记录字符串的长度的,所以一旦修改了字符串,就需要重新分配内存,因为如果没有重新分配,字符串长度增大时会造成内存溢出区溢出,长度减小时会造成内存泄漏。而对于SDS来说,因为有长度熟悉lenalloc属性的存在,SDS实现了空间预分配惰性空间释放两种策略来减少重新分配内存

  1. 空间预分配:SDS对空间进行扩展的时候,扩展的内存比实际需要的多,这样可以减少字符串增长操作所需的内存重新分配次数
  2. 惰性空间释放:SDS对字符串进行缩短操作时,不会立即进行内存重新分配,来回收缩短后多余的内存空间,而是使用alloc将这些字节数量记录下来,等待后续使用
  • 二进制安全

C语言中,是以空字符串作为字符串结束的标识,但是一些特殊的字符串,可能就包括空字符串的,所以容易丢失数据,不能正确存取。而SDS是根据len属性,以处理二进制的方式来处理buf里的数据,所以保存数据更加安全

  • 兼容部分C字符串函数

SDS可以重用C语言库<string.h>中的一部分函数

C字符串和SDS对比

C字符串SDS
获取字符串长度时间复杂度为O(n)获取字符串的长度时间复杂度为O(1)
不安全,可能会造成缓冲区溢出安全,不会造成缓冲区溢出
修改字符串n次就需要进行n次内存分配修改字符串长度n次,最多需要n次内存分配
只能保存文本数据可以保存文本数据或者二进制数据
可以使用所有<string.h>库中的函数可以使用一部分<string.h>库中的函数

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

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

相关文章

解决“找不到msvcp140.dll无法继续执行代码”问题:技术困境与解决方案

在现代计算机技术的发展中&#xff0c;软件依赖性问题日益凸显&#xff0c;其中“找不到msvcp140.dll无法继续执行代码”错误尤为常见。本文将从技术背景、问题成因、解决方案及预防措施四个方面&#xff0c;深入探讨这一技术困境&#xff0c;旨在为读者提供全面的理解和有效的…

来云栖大会!探展云上开发,沉浸式体验云原生 + AI 新奇玩法

2024 云栖大会来了&#xff01; 本届云栖大会将于 9 月 19 日至 9 月 21 日 在杭州云栖小镇召开 汇集全球最新云计算、AI 硬科技 云栖大会的主论坛将设置三个对话环节&#xff0c;大模型、自动驾驶和机器人领域的领军技术人和明星创业者将分享 AI 前沿趋势和应用进展。 20…

北京网页制作-网站策划

北京网页制作与网站策划 随着互联网的快速发展&#xff0c;网页制作和网站策划逐渐成为企业成功的重要因素。在北京这座现代化的大都市&#xff0c;各行各业都意识到网络的重要性&#xff0c;纷纷投身于网页制作与网站策划的浪潮中。本文将探讨北京网页制作的现状、常见的策划流…

基于Java web技术开发设计的学生信息管理系统

学生信息管理系统&#xff1a;Java Web技术与MySQL数据库的融合应用 包含初始化sql脚本 本毕业设计聚焦于构建一套高效、安全的学生信息管理系统&#xff0c;该系统采用先进的Java Web技术进行开发&#xff0c;并依托MySQL数据库实现数据的高效存储与管理。 背景与挑战&…

超声波清洗机的优势有哪些?四款精品超声波清洗机推荐,闭眼入

在这个快节奏的时代里&#xff0c;清洁和卫生变得尤为重要。对于那些追求精致生活的人们来说&#xff0c;家中配备一台超声波清洗机无疑是一件居家的好选择。本文将为您介绍四款广受好评的超声波清洗机&#xff0c;让您在日常清洗中也能享受到科技带来的便捷与舒适。无论是眼镜…

九、Redis 的实际使用与Redis的设计

一、多级缓存架构 在线上系统中&#xff0c;一定不会单纯的只部署一个Redis集群&#xff0c;而是使用Redis结合其他的多级缓存应用进行架构。 使用多级缓存架构的优点就是可以使不同类型的数据分布在不同的应用中&#xff0c;比如redis的热点key可以存储到nginx本地缓存、服务…

[渗透测试]-CVE-2016-4437-Shiro550漏洞复现

Shiro550漏洞爆出的时间是2016年为第4437个漏洞&#xff0c;所以它的CVE编码是2016-4437 文章目录 前言 什么是Shiro550漏洞&#xff1f; 1.Shiro550漏洞原理&#xff1a; 2.漏洞利用 3.漏洞复现&#xff1a; 前提&#xff1a;下载并打开vulhub靶场。 CVE-2016-4437-shiro550漏…

基于react native的锚点

基于react native的锚点 效果示例图示例代码 效果示例图 示例代码 /* eslint-disable react-native/no-inline-styles */ import React, { useEffect, useRef, useState } from react; import {Image,ImageBackground,ScrollView,StyleSheet,Text,TouchableOpacity,View, } fr…

怎么选到好用的运动耳机?这五款年度精选骨传导耳机非常好用!

在过去的两年里&#xff0c;骨传导耳机逐渐被大众的所熟知。可能毕竟长时间使用音量过大的传统入耳式耳机&#xff0c;多多少少会对我们的听力健康构成威胁。所以很多人就想找一款不伤耳朵的耳机。然后就了解到了骨传导耳机&#xff0c;所以就会延伸出这些问题——骨传导耳机好…

【Canvas与密铺】90年代马赛克密铺效果 1920x1080

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>20世纪90年代马赛克瓷砖效果1920x1080</title><style type&…

美创获评CNVD年度原创漏洞发现贡献单位!

9月10日&#xff0c;第21届中国网络安全年会暨网络安全协同治理分论坛在广州成功举办。会上&#xff0c;美创科技首次获评“CNVD年度原创漏洞发现贡献单位”。 美创科技依托第59号安全实验室&#xff0c;专注数据安全技术和攻防研究。凭借深厚的技术积累与优势&#xff0c;被遴…

SEAFARING靶场渗透

一.SQL注入漏洞 1.输入id1 -- 下方出现数据说明闭合成功 2.测试得出数据库有三列 3.三处都是回显点 4.联合查询爆出库名 5.查表名 ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schematest-- 6.查字段名 ?id-1 union sele…

vscode spring boot项目编辑yaml不自动提示补全如何解决

文章目录 properties能够自动弹出提示但是YAML文件就不会自动弹出提示ctrl空格不出提示的解决办法 properties能够自动弹出提示 但是YAML文件就不会自动弹出提示 只是不会自动弹出来而已&#xff0c;按ctrl空格即可解决 ctrl空格不出提示的解决办法 如果按ctrl空格没有用 …

WGCLOUD使用指南 - 自动计算磁盘剩余空间的可使用天数

WGCLOUD是一款免费开源的运维监控软件&#xff0c;性能优秀&#xff0c;部署简单&#xff0c;轻巧使用&#xff0c;支持大部分的Linux和Windows、安卓、MacOS等平台安装部署 最近发布的新版本&#xff0c;WGCLOUD新增了可以自动计算每个磁盘剩余空间的可使用天数&#xff0c;主…

你还在为写PPT而烦恼吗,Kimi一键帮你生成PPT

PPT已经成为我们日常工作和学习中不可或缺的一部分。无论是企业会议、学术报告还是产品展示&#xff0c;一个精心制作的PPT都能有效提升信息传递的效率和质量。然而&#xff0c;制作一个既美观又专业的PPT并非易事&#xff0c;它需要耗费大量的时间和精力。幸运的是&#xff0c…

中伟视界:皮带跑偏检测算法及其实现模型和判断方法

皮带输送机广泛应用于矿山、港口、化工等行业&#xff0c;其正常运行对生产效率和安全性至关重要。皮带跑偏是输送机常见的故障之一&#xff0c;可能导致物料撒落、设备损坏&#xff0c;甚至引发安全事故。为了有效监测和预防皮带跑偏&#xff0c;现代技术利用多种算法模型和判…

还有哪个地方能申请到免费一年期的SSL证书?

SSL证书是互联网中用于加密网站与访问者之间数据传输的安全证书。它通过数字签名确认网站的真实身份&#xff0c;确保数据传输的私密性、完整性和服务器身份的真实性&#xff0c;有效防止数据在传输过程中被窃取或篡改&#xff0c;是保障网站安全性的重要手段。 永久免费SSL证…

20240914 每日AI必读资讯

刚刚&#xff0c;OpenAI震撼发布o1大模型&#xff01;强化学习突破LLM推理极限 - OpenAI o1模型需要简单、直接的提示&#xff0c;而非复杂的指导。 - 避免使用思路链提示&#xff0c;因为o1模型已经具备内部推理能力。 - 使用分隔符来明确模型解析的部分&#xff0c;并限制…

绝佳的知乎展示形式,助力品牌信息全面曝光

知乎作为国内领先的中文互联网问答社区&#xff0c;汇聚了亿万高价值用户&#xff0c;其独特的内容生态与深度互动机制&#xff0c;为品牌提供了前所未有的营销舞台。云衔科技作为数字营销领域的佼佼者&#xff0c;携手知乎&#xff0c;为您量身打造了一套集信息流广告、知广告…

Debian11之DolphinScheduler使用

登录 默认用户名和密码 admin/dolphinscheduler123 http://192.168.111.180:12345/dolphinscheduler/ui基础配置 创建队列【admin用户下】 创建Worker分组管理【admin用户下】 关联某个工作节点服务器&#xff0c;创建项目的时候会指定Worker分组&#xff0c;这个配置决定了…