Redis底层数据结构?编码与底层数据结构的映射?

news2025/4/8 5:10:35

Redis底层数据结构

一、简单动态字符串(SDS)
结构:

struct sdshdr {
    int len;     // 已使用字节长度 
    int free;    // 未使用字节长度 
    char buf[];  // 字节数组(兼容C字符串)
};

特点:

  1. 二进制安全:支持存储包含空字符(\0)的二进制数据,适用于图片、音频等。
  2. 高效长度获取:直接读取len属性,时间复杂度O(1),而C字符串需遍历O(n)。
  3. 内存预分配:扩展时分配额外空间(如新长度+扩展后长度x2),减少频繁内存分配。
  4. 惰性释放:缩短字符串时保留未使用空间,避免立即内存回收。

应用场景:所有Redis键和字符串值的底层实现。

二、压缩列表(Ziplist)
结构:
连续内存块,包含:

  • zlbytes(总字节数)、zltail(尾节点偏移量)、zllen(元素个数)
  • 每个节点存储前驱长度、当前数据类型/长度、实际数据
  • zlend标记结尾(0xFF)。

特点:

  1. 内存紧凑:无指针开销,适合小规模数据(如哈希、列表元素少时)。
  2. 顺序访问:查找中间元素需遍历,时间复杂度O(n),但头尾操作高效O(1)。

应用场景:小规模哈希(Hash)、列表(List)和有序集合(ZSet)的底层实现。

三、哈希表(Hashtable)
结构:

typedef struct dict {
    dictEntry table;      // 哈希桶数组 
    unsigned long size;     // 桶数量 
    unsigned long sizemask; // 哈希掩码(size-1)
    unsigned long used;     // 已存元素数量 
} dict;

特点:

  1. 链式哈希冲突解决:哈希桶通过链表存储冲突元素。
  2. 渐进式Rehash:扩容时逐步迁移数据,避免单次迁移阻塞服务。
  3. 动态扩容:当负载因子(used/size)超过阈值(默认1)时,扩容至2倍。

应用场景:大规模哈希(Hash)、集合(Set)的底层实现。

四、跳跃表(Skiplist)
结构:
多层有序链表,节点包含:

  • 分值(score)用于排序
  • 后退指针(BW)用于逆序访问
  • 多层前进指针(L1-Ln)加速范围查询。

特点:

  1. 高效范围查询:时间复杂度O(log n),适合有序集合的区间操作(如ZRANGE)。
  2. 动态层数:节点层数基于幂次定律随机生成(1-32层),平衡查询与内存。

应用场景:有序集合(ZSet)的底层实现之一(与哈希表配合)。

五、整数集合(Intset)
结构:

typedef struct intset {
    uint32_t encoding;  // 编码类型(int16/32/64)
    uint32_t length;    // 元素数量 
    int8_t contents[];  // 整数数组 
} intset;

特点:

  1. 自动升级编码:插入更大整数时升级数组类型(如int16→int32)。
  2. 内存紧凑:仅存储整数,无指针开销。

应用场景:元素均为整数的小规模集合(Set)。

六、快速列表(Quicklist)
结构:
双向链表 + 压缩列表(Ziplist),节点为Ziplist片段。
特点:

  1. 平衡内存与性能:大列表拆分为多个Ziplist节点,减少内存碎片。
  2. 支持头尾高效操作:双向链表结构支持快速插入/删除。

应用场景:列表(List)的默认底层实现。

七、其他优化结构

  1. embstr编码字符串:短字符串(≤44字节)与redisObject连续存储,减少内存分配次数。
  2. listpack(替代Ziplist):新版Redis引入,取消节点间依赖,提升并发安全性。

总结:Redis数据结构选择策略

数据类型可能编码选择条件(示例)
字符串int/embstr/raw整数值/短字符串/长字符串
列表quicklist所有列表操作(默认)
哈希ziplist/hashtable字段数≤hash-max-ziplist-entries
集合intset/hashtable元素全为整数且数量少
有序集合ziplist/skiplist+dict元素数≤zset-max-ziplist-entries

编码与底层数据结构的映射

一、字符串对象(OBJ_STRING)

编码方式底层数据结构触发条件与特性
OBJ_ENCODING_INT直接存储整数值当值为整数且范围在LONG_MINLONG_MAX之间时使用,内存占用最小。
OBJ_ENCODING_EMBSTR紧凑存储的SDS字符串长度≤44字节(Redis 3.2+)时,redisObject与SDS连续存储,减少内存分配次数。
OBJ_ENCODING_RAW标准SDS结构字符串长度>44字节或经过修改的embstr对象,支持动态扩容。

二、列表对象(OBJ_LIST)

编码方式底层数据结构触发条件与特性
OBJ_ENCODING_QUICKLIST快速列表(Quicklist)所有列表的默认实现,由双向链表和多个Ziplist节点组成,平衡内存与操作效率。

三、哈希对象(OBJ_HASH)

编码方式底层数据结构触发条件与特性
OBJ_ENCODING_ZIPLIST压缩列表(Ziplist)当哈希字段数≤hash-max-ziplist-entries(默认512)且所有值长度≤hash-max-ziplist-value(默认64字节)时使用。
OBJ_ENCODING_HT哈希表(Hashtable)超出Ziplist阈值时自动转换,支持高效的随机读写操作。

四、集合对象(OBJ_SET)

编码方式底层数据结构触发条件与特性
OBJ_ENCODING_INTSET整数集合(Intset)集合元素全为整数且数量≤set-max-intset-entries(默认512)时使用,内存紧凑。
OBJ_ENCODING_HT哈希表(Hashtable)包含非整数元素或元素数量超过阈值时转换,键存储元素、值设为NULL。

五、有序集合对象(OBJ_ZSET)

编码方式底层数据结构触发条件与特性
OBJ_ENCODING_ZIPLIST压缩列表(Ziplist)元素数≤zset-max-ziplist-entries(默认128)且所有成员长度≤zset-max-ziplist-value(默认64字节)时使用,按分值排序。
OBJ_ENCODING_SKIPLIST+HT跳跃表(Skiplist)+哈希表超出Ziplist阈值时转换,跳跃表支持范围查询,哈希表提供O(1)的单元素访问。

六、编码动态转换机制

  1. 自动升级
    • 当数据特征超出当前编码的容量或类型限制时,自动切换为更高效的编码(如Ziplist→Hashtable)。
  2. 不可逆操作
    • 大部分转换是单向的(如Intset→Hashtable),Redis不主动降级以节省计算资源。

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

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

相关文章

HarmonyOS-ArkUI Ability进阶系列-UIAbility与各类Context

UIAbility及相关类关系 一个模块编译的时候会出一个HAP包, 每一个HAP包在运行时都对应一个AbilityStage。 AbilityStage持有一个AbilityStageContext一个APP, 有时候会有很多个HAP包, 至少一个。 一个APP运行时,对应的是我们的App…

剑指Offer(数据结构与算法面试题精讲)C++版——day4

剑指Offer(数据结构与算法面试题精讲)C版——day4 题目一:和为k的子数组题目二:0和1个数相同的子数组题目三:左右两边子数组的和相等 题目一:和为k的子数组 结合前面着重阐述的双指针法这一经典的算法技巧&…

WebRTC技术简介及应用场景

写在前面 本文是参考稀土掘金的文章,整理得出,版权归原作者所有!参考链接请点击跳转 WebRTC(Web Real-Time Communication) 是一项开源技术,允许浏览器和移动应用直接进行实时音视频通信和数据传输,无需安装插件或第三方软件。它…

介绍几种创意登录页(含完整源码)

今天为大家收集了几种不同风格的登录页,搭配动态渐变背景,效果绝对惊艳! CSS3实现动态渐变玻璃拟态登录页 一、开篇语 纯CSS实现当下最火的玻璃拟态(Morphism)风格登录页,搭配动态渐变背景,效果绝对惊艳! …

Uni-app入门到精通:uni-app的基础组件

1、view view是容器组件&#xff0c;类似于HTML中的<div></div>标签&#xff0c;用于包裹各种元素内容&#xff0c;是页面布局常用的组件。view组件的属性如下 属性类型默认值说明hover-classStringnone指定按下去的样式类。当hover-class"none"时&…

大文件上传源码,支持单个大文件与多个大文件

大文件上传源码&#xff0c;支持单个大文件与多个大文件 Ⅰ 思路Ⅱ 具体代码前端--单个大文件前端--多个大文件前端接口后端 Ⅰ 思路 具体思路请参考我之前的文章&#xff0c;这里分享的是上传流程与源码 https://blog.csdn.net/sugerfle/article/details/130829022 Ⅱ 具体代码…

C语言--插入排序

插入排序&#xff1a;简单而高效的排序算法 在计算机科学中&#xff0c;排序是一种常见的操作&#xff0c;用于将一组数据按照特定的顺序排列。插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的工作原理类似于我们整理扑克牌的过程。…

L2-024 部落 #GPLT,并查集 C++

文章目录 题目解读输入格式输出格式 思路Ac Code参考 题目解读 我们认为朋友的朋友都算在一个部落里&#xff0c;于是要请你统计一下&#xff0c;在一个给定社区中&#xff0c;到底有多少个互不相交的部落&#xff1f;并且检查任意两个人是否属于同一个部落。 输入格式 第一…

在线记事本——支持Markdown

项目地址 https://github.com/Anyuersuper/CloudNotebook 百度网盘 通过网盘分享的文件&#xff1a;CloudNotebook-master.zip 链接: https://pan.baidu.com/s/1_Y--aBzNkKiFRIMHYmwPdA?pwdyuer 提取码: yuer &#x1f4dd; 云笔记 (Cloud Notebook) 云笔记是一个简洁、安全…

Day2:前端项目uniapp壁纸实战

先来做一个轮番图。 效果如下&#xff1a; common-style.css view,swiper,swiper-item{box-sizing: border-box; } index.vue <template><view class"homeLayout"><view class"banner"><swiper circular indicator-dots autoplay…

LeetCode Hot100 刷题笔记(3)—— 链表

目录 前言 1. 相交链表 2. 反转链表 3. 回文链表 4. 环形链表 5. 环形链表 II 6. 合并两个有序链表 7. 两数相加 8. 删除链表的倒数第 N 个结点 9. 两两交换链表中的节点 10. K 个一组翻转链表 11. 随机链表的复制 12. 排序链表 13. 合并 K 个升序链表 14. LRU 缓存 前言 一、…

状态机思想编程

1. LED流水灯的FPGA代码 在这个任务中&#xff0c;首先我们会使用状态机的思想来设计一个LED流水灯的控制逻辑。LED流水灯一般需要依次点亮不同的LED&#xff0c;并且循环播放。我们将其分为几个状态&#xff0c;每个状态控制一个或一组LED灯。 状态机设计 假设我们有8个LED…

第二十八章:Python可视化图表扩展-和弦图、旭日图、六边形箱图、桑基图和主题流图

一、引言 在数据可视化领域&#xff0c;除了常见的折线图、柱状图和散点图&#xff0c;还有一些高级图表类型可以帮助我们更直观地展示复杂数据关系。本文将介绍五种扩展图表&#xff1a;和弦图、旭日图、六边形箱图、桑基图和主题流图。这些图表在展示数据关系、层次结构和流量…

基于vue框架的重庆美食网站的设计与实现kt945(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,美食分类,美食菜品 开题报告内容 基于Vue框架的重庆美食网站的设计与实现开题报告 一、选题背景与意义 &#xff08;一&#xff09;选题背景 重庆&#xff0c;作为中国西南地区的璀璨明珠&#xff0c;以其独特的地理位置和丰富…

Metal学习笔记十三:阴影

在本章中&#xff0c;您将了解阴影。阴影表示表面上没有光。当另一个表面或对象使对象与光线相遮挡时&#xff0c;您会看到对象上的阴影。在项目中添加阴影可使您的场景看起来更逼真&#xff0c;并提供深度感。 阴影贴图 阴影贴图是包含场景阴影信息的纹理。当光线照射到物体…

时间梯度匹配损失 TGMLoss

目录 时间梯度匹配损失(Temporal Gradient Matching Loss, TGM Loss) 完整示例,该损失函数常用于视频预测、运动平滑等任务,通过约束预测序列的时间梯度与真实序列一致来提升时序连续性 训练测试demo代码: 时间梯度匹配损失(Temporal Gradient Matching Loss, TGM Los…

iPhone XR:一代神机,止步于此

什么样的 iPhone &#xff0c;才配称为一代神机&#xff1f; 我曾经用过iPhone 4S、iPhone 6S Plus、iPhone 8 Plus&#xff0c;iPhone SE2、iPhone XR、iPhone 13、iPhone 14 Plus、iPhone 15/Pro。 不管硬件再怎么卷&#xff0c;不管囊中是否羞涩&#xff0c;主力机基本没考…

第十四届蓝桥杯省赛真题解析(含C++详细源码)

第十四届蓝桥杯省赛 整数删除满分思路及代码solution1 &#xff08;40% 双指针暴力枚举&#xff09;solution 2&#xff08;优先队列模拟链表 AC&#xff09; 冶炼金属满分代码及思路 子串简写满分思路及代码solution 1&#xff08;60% 双指针&#xff09;solution 2&#xff0…

OpenAI即将开源!DeepSeek“逼宫”下,AI争夺战将走向何方?

OpenAI 终于要 Open 了。 北京时间 4 月 1 日凌晨&#xff0c;OpenAI 正式宣布&#xff1a;将在未来几个月内开源一款具备推理能力的语言模型&#xff0c;并开放训练权重参数。这是自 2019 年 GPT-2 部分开源以来&#xff0c;OpenAI 首次向公众开放核心模型技术。 【图片来源于…

mysql 8.0.27-docker

安装 可以略过本步 https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/ 镜像查询与安装 先查询&#xff1a; docker search mysql 明显会报错 Error response from daemon: Get "https://index.docker.io/v1/search?qmysql&n25": dial tcp…