Redis底层数据结构之字符串的SDS

Grok-1.5+Ollama企业级本地化部署与合规实践指南 本文详细介绍了Grok-1.5+Ollama企业级本地化部署与合规实践指南,重点分析了本地化部署的成本优势和数据主权保障。通过RTX 4090显卡的硬件选型、Ubuntu 22.04系统优化及部署流程中的关键陷阱规避,为企业提供了高效、安全的AI模型部署方案。特别适合金融、医疗等敏感行业。 阅读详情

前言
在这里插入图片描述

PS:Redis有八种编码,但底层数据机构是六种。
在这里插入图片描述

二、SDS(simple dynamic string)简单动态字符串

结构定义

struct sdshdr{
     //记录buf数组中已使用字节的数量
     //等于 SDS 保存字符串的长度
     int len;
     //记录 buf 数组中未使用字节的数量
     int free;
     //字节数组,用于保存字符串
     char buf[];
}

SDS保存的字符串结构图示:
在这里插入图片描述
优势:

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

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

杜绝缓冲区溢出

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

减少修改字符串的内存重新分配次数

空间预分配和惰性释放空间:在字符串修改时,长度增加时,C语言首先通过对内存的释放和申请来确保不会出现缓冲区溢出,减少时则可能发生内存泄漏,而SDS通过len和free属性来实现预分配和惰性释放。
空间预分配: Redis会提前申请大于实际需要内存空间,用free属性记录,用作后续的扩展,减少字符串增长后所需空间不足重新分配的过程。
惰性释放:当字符串修改操作,减少字符串长度时,使用free属性记录,而不是立即重新分配来释放多余空间,当然也可以手动的去释放多余空间。

二进制安全

在C语言中,字符串的结尾以空字符串 ‘\0’来进行标识,而在实际存储二进制文件时,可能会存在具有实际意义的空字符串,此时C语言无法正确的存取,而Redis是通过len字段来标识字符串是否结束,可以保证二进制安全。

兼容部分C字符串函数
在这里插入图片描述
SDS 除了保存数据库中的字符串值以外,SDS 还可以作为缓冲区(buffer):包括 AOF 模块中的AOF缓冲区以及客户端状态中的输入缓冲区

借鉴

RK3568笔记十七:LVGL v8.2移植 若该文为原创文章,转载请注明原文出处。本文介绍嵌入式图形库移植到Linux开发板ATK-RK3568上的步骤。 阅读详情

相关推荐

SAP MTO实战:从销售订单到生产订单的精准触发与配置详解

本文深入解析SAP系统中按订单生产(MTO)模式的核心流程与配置。详细阐述了如何通过精准配置物料主数据策略组、需求类型及计划策略(如策略50),实现从销售订单自动触发生产订单的完整链路。文章结合实战案例,指导用户打通销售与生产环节,并提供了关键事务代码与常见问题排查指南,助力企业实现以销定产,优化库存与成本控制。

weixin_29300931的博客 214

redis的字符串底层结构

redis的字符串底层结构 struct sdshdr { // 记录 buf 数组中已使用字节的数量 // 等于 SDS 所保存字符串的长度 int len; // 记录 buf 数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[]; }; 遵循空字符结尾这一惯例的好处是, SDS 可以直接重用一部分 C 字符串函数库里面的函数。C保存的原因我认为是判断字符串长度的一个临界值 那么它与c字符串

jiohfgj的博客 352

数据库和BI工程师面试题

 一.数据库 1.Oracle数据库,视图与表的区别?普通视图与物化视图的区别?物化视图的作用? 2.Oracle数据库,有哪几类索引,分别有什么特点? 3.Union与Union All的区别? 4.对游标的理解?游标的分类?使用方法? 5.如何查找和删除表中的重复数据?给出方法或SQL。 6.不借助第三方工具,怎么查看SQL的执行计划? 7.创建索引有哪些需要注意的要点?

web_go_run的专栏 1万+

Redis底层数据结构之动态字符串(SDS)

本文介绍了Redis底层数据结构SDS(Simple Dynamic String)的设计原理及其优势。SDS通过len、alloc等字段实现O(1)时间复杂度获取字符串长度、二进制安全、避免缓冲区溢出,并利用空间预分配和惰性空间释放优化性能。相比C语言原生字符串,SDS更适应Redis的高效需求,如频繁的字符串追加和长度计算。文章还探讨了SDS的空间分配规则及其潜在内存影响。

zErO__N的博客 898

matebookego win11 arm 系统安装安卓子系统

一般的x86电脑如果安装android子系统,运行安卓子系统,由于要将android arm代码转译为x86代码,所以效率不一定高,但是如果电脑是arm架构的,通过安卓子系统运行android的程序执行效率就会 高不少,本文参考,都是在win11 home版本下的。两者跑分在cpu上差不太多了,大约是枭龙855的水平了,这个水平的子系统就有一定的实用性了,玩个一般游戏,刷个抖音都很流畅的。启动子系统后,点击左上角的设置,启用 “开发人员模式”。然后就可以再通运运行华为应用商店来进行安装其它应用了。

babytiger的专栏 1万+

CATIA二次开发CAA安装

安装资料在网盘里 Win7 64位 以下软件均已管理员身份运行: 1.安装vs2008->自定义安装->选择要安装的功能->Visual C+±>x64编译器和工具 1.2安装SP1 2.安装CATIA V5 R21->win7_XP->CATIA.P3.V5R21.Win64->setup.exe 2.1安装目录改为D盘 2.2环境目录位置默认 3.安装...

qq_39311458的博客 4631

Redis底层数据结构分析(一) —— SDS动态字符串

Redis官网文档Redis源码仓库Redis是一个基于内存的高性能键值存储系统。Redis支持多种数据类型,包括字符串、哈希、列表、集合、有序集合等。每种数据类型在底层都有对应的数据结构实现。SDS动态字符串双向链表压缩链表ziplist哈希表hashtable跳表skiplist整数数组intset快速列表quicklist紧凑列表listpack💡 Tips:官网说明💡 Tips:对应文件。

小熊的学习记录 1162

GlobalMapper地形对比与方量计算实战:从两期数据到填挖方区域精准提取

本文详细介绍了使用GlobalMapper进行地形对比与方量计算的实战方法,从两期数据准备到填挖方区域精准提取。通过三步核心操作和实用技巧,帮助工程师高效完成土方平衡分析,提升工程预算精度。特别适用于河道整治、湿地修复等工程项目,大幅减少人工计算误差和时间成本。

weixin_28698059的博客 221

Redis系列 - Redis底层数据结构(简单动态字符串(SDS)、链表、字典、跳跃表、整数集合、压缩列表)

Redis系列 - Redis基本数据类型

u011485472的博客 2133

IC版图设计布局经验90条!

13 如果一个cell调用其它cell,被调用的cell的vssx,vddx,vssb,vddb如果没有和外层cell连起来,要打上PIN,否则通不过diva检查.尽量在布局低层cell时就连起来。48 在匹配电路的mos管左右画上dummy,用poly,poly的尺寸与管子尺寸一样,dummy与相邻的第一个poly gate的间距等于poly gate之间的间距。8 更改cell时查看路径,一定要在正确的library下更改,以防copy过来的cell是在其他的library下,被改错。

weixin_44606964的博客 910

超分辨率重建:ESPCN与SRGAN技术对比

超分辨率重建:ESPCN与SRGAN技术对比​ 人工智能,计算机视觉,大模型,AI,超分辨率重建是一种通过技术手段,将低分辨率图像转换为高分辨率图像的过程。它的目的是恢复低分辨率图像中丢失的细节信息,使图像具有更高的清晰度和视觉质量。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

Redis底层数据结构之SDS简单动态字符串

在Redis的数据库里面,包含字符串值的键值对咋底层都是由SDS实现的,也就是简单动态字符串(simple dynamic string)。 除了用来保存数据库中的字符串值之外,SDS还被用作缓存区(buffer)。 1.SDS的定义 每个sds.h/sdshdr结构表示一个SDS的值: struct sdshdr{ //记录buf数组中已使用字节的数量 //等于SDS所保存字符串的长度 int len; //记录buf数组中未使用字节的数量 int free; //字节数组,用于保存字符串

d303577562的博客 225

基于STM32设计的太阳能智慧路灯_444

本文设计并实现了一种基于 STM32 的太阳能智慧路灯系统。系统以 STM32F103C8T6 单片机为核心,集成温湿度检测、空气质量检测、环境光照检测、行人检测和路灯故障检测等功能,实现对路灯运行环境和工作状态的实时感知。

462

【面试】Redis底层数据结构——SDS动态字符串

SDS简单动态字符串 数据结构 3.2之前 typedef char *sds struct sdschar { // buf[] 中已使用的字节数 int len; // buf[] 中未使用的字节数 int free; // 字符数组,用于实际存储字符串内容 char buf[]; } 3.2之后 对于不同长度的字符串,使用不同的数据结构 /*...

内脏裂了 4622

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Redis 底层数据结构 —— SDS(简单动态字符串)

sds结构详解

m0_62909831的博客 2247

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Redis学习笔记(五)--Redis底层数据结构之简单动态字符串SDS

本文介绍了Redis底层的数据结构简单动态字符串SDS的原理,为作者在学习Rdis时的笔记,特此比记录,以便后续学习中能够查漏补缺。

Scr1Pt的博客 1412

Redis底层数据结构-简单动态字符串SDS

Redis 只会使用 C 字符串作为字面量, 在大多数情况下, Redis 使用 SDS (Simple Dynamic String,简单动态字符串)作为字符串表示。比起 C 字符串, SDS 具有以下优点:常数复杂度获取字符串长度。杜绝缓冲区溢出。减少修改字符串长度时所需的内存重分配次数。二进制安全。兼容部分 C 字符串函数。

Sajor的博客 1304

redis源码-底层数据结构之动态字符串sds

redis数据结构动态字符串-sdsredis动态字符串sds简介redis字符串sds底层结构-定义创建sds动态字符串获取sds长度redis针对字符串提供的方法总结 redis动态字符串sds简介   首先介绍下c中的字符串,c语言中所有的"字符串"其实都是字符数组,可以使用char * str= “123”;定一个一个字符串,其中str是指向字符数组第一个字节处的地址,*str == s...

W_Hfly的博客 446

最新redis底层数据结构之SDS(简单动态字符串)

简单动态字符串(simple dynamic string,SDS) typedef struct redisObject { // 类型 unsigned type:4; // 编码 unsigned encoding:4; // 对象最后一次被访问的时间 unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ // 引用计数 int refcount

eno_yang的博客 1621

【Redis学习笔记】字符串底层数据结构SDS

二、简单动态字符串 2.1 SDS 的定义 SDS 是【简单动态字符串】,其结构如下: free 属性值为 0,表示这个 SDS 没有分配任何未使用的空间。 len 属性值为 5,表示这个 SDS 保存了一个五字节长的字符串(’\0’不包括在内)。 buf 属性是一个 char 类型的数组,保存数据,最后一个字节保存了空字符 ‘\0’。 2.2 SDS 与 C 字符串的区别 2.2.1 常数复杂度获取字符串长度 因为 C 字符串并不记录自身的长度信息,所以为了获取一个 C 字符串的长度,程序必须遍历整

kingdow-liu 524

redis底层数据结构: 动态字符串SDS

redis底层数据结构简单动态字符串底层数据结构

tuoshu9814的博客 611

Redis底层数据结构:SDS简单动态字符串(彻底详解)

Redis中的SDS(简单动态字符串)是其自定义的字符串结构,相比C原生字符串具有四大优势:1)O(1)时间复杂度获取长度;2)自动扩容避免缓冲区溢出;3)通过预分配和惰性释放减少内存分配;4)支持二进制数据存储。SDS通过len字段记录长度、free字段管理空闲空间,在扩容时遵循小于1MB双倍扩容、大于1MB追加1MB的规则,缩容时自动回收多余空间。这种设计使SDS成为Redis高效安全的核心数据结构。

2402_87794035的博客 70

Redis的底层数据结构----简单动态字符串_SDS

Redis的底层数据结构一. 简单动态字符串(SDS)①. SDS 定义②. SDS优点①、常数复杂度获取字符串长度②、杜绝缓冲区溢出③、减少修改字符串的内存重新分配次数④、二进制安全⑤、兼容部分 C 字符串函数二. 链表①. 链表定义②. Redis链表特性③. 双向无环链表在Redis中的使用 一. 简单动态字符串(SDS) Redis 是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple

407

Redis(1)——底层数据结构 —— SDS(简单动态字符串)

SDS 全称为 simple dynamic string,简单动态字符串 1. SDS 的用处 SDS 在 Redis 中大致有四种用处 Redis 的 key-value 键值对中的键 Redis 的 key-vlaue 中的 value 类型为 String 的 value AOF 缓冲区 客户端状态中的输入缓冲区 2. SDS 的 c 语言定义 每个 sds.h/sdshdr 结构...

qq_39219279的博客 310

redis底层数据结构之简单动态字符串(SDS)

redis之SDS底层结构

junff 405

Redis 底层数据结构-简单动态字符串(SDS)

redis底层数据结构-简单动态字符串(SDS)浅析

weixin_56637697的博客 322

【Redis】数据结构与对象(六种底层数据结构)——简单动态字符串 SDS

简单来说,底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。它们和数据类型的对应关系如下图所示: String 类型的底层实现只有一种数据结构,也就是简单动态字符串。 简单动态字符串SDS SDS是"simple dynamic string"的缩写。 Redis中所有场景中出现的字符串,基本都是由SDS来实现的: 所有非数字字符串对象的key。例如set msg "hello world" 中的key msg. 字符串数据类型的值。例如set msg

your_棒棒糖的博客 246
上一篇: Redis底层数据结构之有序集合的跳跃表
下一篇: Redis底层数据结构之双端链表
苦艾酒丶
博客等级 码龄9年 41粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值