当前位置: 首页 > news >正文

【Redis】SDS结构

目录

  • 1、背景
  • 2、SDS底层实现

1、背景

redis作为高性能的内存数据库,对字符串操作(如键、值的存储)有极高的要求。c语言原生字符串(以\0结尾的字符串数据)有一些缺点:长度计算需要遍历(O(n)时间复杂度)、频繁内存重分配、二进制不安全、无缓冲区管理。为了解决这些问题,redis使用了SDS(Simple Dynamic String),在兼容c字符串的同时,提供了更高效、更安全的能力。

2、SDS底层实现

SDS底层结构体如下:

//redis 5+已弃用
struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[];
};//存储长度范围:0~255(2的8次方减1)
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[];
};//存储长度范围:256~65535(2的16次方减1)
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[];
};//存储长度范围:656536~(2^32-1)
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[];
};//存储长度范围:大于等于2^32字节
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[];
};

根据存储字符串的大小使用不同的sdshdr结构,其字段含义为:

字段名含义
len字符串实际长度(已用字节数)
alloc分配的总容量(不包括头部和结尾的\0)
flagsSDS类型
buf[]存储实际数据

flags代表的宏定义如下:

#define SDS_TYPE_5  0
#define SDS_TYPE_8  1
#define SDS_TYPE_16 2
#define SDS_TYPE_32 3
#define SDS_TYPE_64 4

SDS的特性如下:

特性实现原理
O(1)长度获取直接读取len字段,无需遍历
二进制安全通过len记录字节数(而非依赖\0),可存储任意二进制数据
内容预分配扩容时按规则分配额外空间,减少重分配次数
惰性释放缩容时不立即释放内存,通过alloc字段记录剩余空间,供后续操作复用
兼容c字符串在buf末尾自动追加\0,可直接传递buf给c函数

文章转载自:
http://actinal.wkuuf.cn
http://cervantite.wkuuf.cn
http://anzuk.wkuuf.cn
http://caesaropapist.wkuuf.cn
http://anjou.wkuuf.cn
http://chorographic.wkuuf.cn
http://alaskan.wkuuf.cn
http://annual.wkuuf.cn
http://barebacked.wkuuf.cn
http://awesome.wkuuf.cn
http://alpeen.wkuuf.cn
http://briseis.wkuuf.cn
http://baroscope.wkuuf.cn
http://biphenyl.wkuuf.cn
http://chafe.wkuuf.cn
http://aviary.wkuuf.cn
http://agency.wkuuf.cn
http://acuminous.wkuuf.cn
http://arbitrational.wkuuf.cn
http://aauw.wkuuf.cn
http://cateyed.wkuuf.cn
http://bladdernose.wkuuf.cn
http://canaller.wkuuf.cn
http://balding.wkuuf.cn
http://ayc.wkuuf.cn
http://catechetics.wkuuf.cn
http://added.wkuuf.cn
http://baalize.wkuuf.cn
http://chrematistic.wkuuf.cn
http://banzai.wkuuf.cn
http://www.dtcms.com/a/187068.html

相关文章:

  • 图形化编程平台的破局之道:从工具同质化到生态差异化
  • 从MCU到SoC的开发思维转变
  • 2024年北理工Python123第六章测验题整理
  • React 播客专栏 Vol.9|React + TypeScript 项目该怎么起步?从 CRA 到配置全流程
  • 2025年Energy SCI1区TOP,改进雪消融优化算法ISAO+电池健康状态估计,深度解析+性能实测
  • UE RPG游戏开发练手 第二十一课 使用C++代码实现装备武器
  • C/C++ 内存管理深度解析:从内存分布到实践应用(malloc和new,free和delete的对比与使用,定位 new )
  • 如何使用 WebBrowserPassView 查看所有浏览器密码?
  • 用户态到内核态:Linux信号传递的九重门(二)
  • 动手学深度学习12.4.硬件-笔记练习(PyTorch)
  • 应急响应靶机——WhereIS?
  • C# 中 static的使用
  • Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁
  • DeepSeek | AI需求分析
  • 从零开始的python学习(七)P89+P90+P91+P92+P93+P94
  • Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用--程序启动界面
  • Python基础:类的深拷贝与浅拷贝-->with语句的使用及三个库:matplotlib基本画图-->pandas之Series创建
  • HDFS概述
  • 杰理强制烧录拨码开关
  • cursor 30.Our servers are currently........
  • 网络层:ICMP协议
  • javascript万字全解知识宝库
  • Unity ML-Agents实战指南:构建多技能游戏AI训练系统
  • 吴恩达机器学习笔记:监督学习
  • 【基于ALS模型的教育视频推荐系统(Java实现)】
  • hashCode()和equals(),为什么使用Map要重写这两个,为什么重写了hashCode,equals也需要重写
  • csdn博客打赏功能
  • 小刚说C语言刷题—1149 - 回文数个数
  • 什么是IP专线?企业数字化转型的关键网络基础设施
  • 大小端的判断方法