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

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

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不主动降级以节省计算资源。

相关文章:

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

Redis底层数据结构 一、简单动态字符串(SDS) 结构: struct sdshdr {int len; // 已使用字节长度 int free; // 未使用字节长度 char buf[]; // 字节数组(兼容C字符串) };特点: 二进制安全&#…...

linux环境下的硬盘分区格式化工具介绍 fdisk,gdisk,parted,cfdisk,cgdisk,sfdisk,gparted 笔记250407

linux环境下的硬盘分区格式化工具介绍 fdisk,gdisk,parted,cfdisk,cgdisk,sfdisk,gparted 笔记250407 以下是 Linux 系统中常用的 硬盘分区与格式化工具,涵盖命令行和图形界面工具,按功能分类整理: 一、分区管理工具 1. 命令行工具 工具功能…...

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

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

前端入门之CSS

CSS: HTML负责定义页面结构;JS负责处理页面逻辑和点击事件;CSS负责用于描述 HTML 元素的显示方式,通过 CSS 可以控制颜色、字体、布局等。 核心语法: 选择器: 类选择器主要用于选中需要添加样式的 HTML 元素。主要分为:类选择器(.class-name { ... })、标签选择器(…...

JavaScript逆向WebSocket协议解析与动态数据抓取

在JavaScript逆向工程中,WebSocket协议的解析和动态数据抓取是关键技能。本文将结合Fiddler、Charles Proxy和APIfox工具,详细讲解如何解析WebSocket协议并抓取动态数据。 一、WebSocket协议解析 (一)WebSocket协议的基本概念 …...

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

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

从代码学习深度学习 - NLP之文本预处理 PyTorch版

文章目录 前言1. 文本预处理理论知识1.1 文本清洗与标准化1.2 分词(Tokenization)1.3 词频统计与词汇表构建1.4 序列表示与批次生成1.5 预处理的意义2. 文本预处理的核心代码解析2.1 读取数据集:`read_time_machine`2.2 分词处理:`tokenize`2.3 词频统计:`count_corpus`2.…...

WebRTC技术简介及应用场景

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

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

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

git分布式控制工具详解

1. 版本控制器的方式 1.1 集中式版本控制工具 特点: 版本库集中存放在中央服务器必须联网才能工作(局域网/互联网)个人修改后提交到中央版本库 举例:SVN、CVS 1.2 分布式版本控制工具 特点: 无"中央服务器&qu…...

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

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

R语言从专家到小白

文章目录 下载安装R下载安装R StudioCRAN 下载安装R Index of /bin https://cran.r-project.org/ 下载安装R Studio https://posit.co/download/rstudio-desktop/ CRAN R综合档案网络。 CRAN 镜像是一个提供 R 语言软件和包的在线服务&#xff0c;用户可以从不同的地区选择…...

显示器工艺简介

华星光电显示器的生产工艺流程介绍&#xff0c;从入厂原料到生产出显示器的整体工艺介绍 华星光电显示器的生产工艺流程主要包括以下几个阶段&#xff0c;从原材料入厂到最终显示器的生产&#xff1a; 原材料准备 玻璃基板&#xff1a;显示器的核心材料&#xff0c;通常采用超…...

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

大文件上传源码&#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;并且检查任意两个人是否属于同一个部落。 输入格式 第一…...

前端面试题(三):axios有哪些常用的方法

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js 中发送 HTTP 请求。它提供了一些常用的方法来处理不同类型的请求。以下是 Axios 中常用的一些方法&#xff1a; 1. axios.get() 用于发送 GET 请求&#xff0c;从服务器获取数据。 axios.get(/api/d…...

JSON 基础知识(一)

第一部分&#xff1a;JSON 基础知识 &#x1f4e2; 快速掌握 JSON&#xff01;文章 视频双管齐下 &#x1f680; 如果你觉得阅读文章太慢&#xff0c;或者更喜欢 边看边学 的方式&#xff0c;不妨直接观看我录制的 JSON 课程视频&#xff01;&#x1f3ac; 视频里会用更直观…...

SSM框架学习(Day-1)

1.spring系统架构 自底而上进行,上层依赖于下层,首先最底层是Core Container -- 核心容器, 再往上是AOP(面向切面编程)和Aspects(AOP)思想的实现, 我个人的理解是, 它可以在不惊动你原始程序的基础上, 给它增强功能&#xff0c;类似于反射&#xff1b;再往上是数据访问层。 C…...

使用 PyTorch 的 `GradualWarmupScheduler` 实现学习率预热

使用 PyTorch 的 GradualWarmupScheduler 实现学习率预热 在深度学习中,学习率(Learning Rate, LR)是影响模型训练效果的关键超参数之一。为了提升模型的收敛速度和稳定性,学习率调度策略变得尤为重要。其中,学习率预热(Learning Rate Warmup) 是一种常用的策略,它通过…...

Redis 中 Set(例如标签) 和 ZSet(例如排行榜) 的详细对比,涵盖定义、特性、命令、适用场景及总结表格

以下是 Redis 中 Set 和 ZSet 的详细对比&#xff0c;涵盖定义、特性、命令、适用场景及总结表格&#xff1a; 1. 核心定义 数据类型SetZSet&#xff08;Sorted Set&#xff09;定义无序的、唯一的字符串集合&#xff0c;元素不重复。有序的、唯一的字符串集合&#xff0c;每个…...

在线记事本——支持Markdown

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

C# 中充血模型和‌贫血模型

在C#中&#xff0c;‌充血模型&#xff08;Rich Domain Model&#xff09;‌和‌贫血模型&#xff08;Anemic Domain Model&#xff09;‌是两种截然不同的领域建模方式&#xff0c;核心区别在于‌业务逻辑的归属‌。以下是通俗易懂的解释&#xff1a; 1. ‌贫血模型&#xff…...

Java技术生态前沿洞察:虚拟线程引领并发革命,框架创新赋能云原生时代

Java技术生态正迎来新一轮变革浪潮。虚拟线程的落地成为高并发编程范式转折点&#xff0c;其极低资源开销特性在电商秒杀场景中展现出3倍吞吐量提升&#xff0c;彻底改写传统线程模型性能边界。Spring Boot 3.2原生支持虚拟线程&#xff0c;结合Observation API与HTTP客户端优化…...

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…...

人工智能赋能工业制造:智能制造的未来之路

一、引言 随着人工智能技术的飞速发展&#xff0c;其应用场景不断拓展&#xff0c;从消费电子到医疗健康&#xff0c;从金融科技到交通运输&#xff0c;几乎涵盖了所有行业。而工业制造作为国民经济的支柱产业&#xff0c;也在人工智能的浪潮中迎来了深刻的变革。智能制造&…...

V-SHOW和箭头函数在VUE项目的踩坑点

v-show和v-if v-show控制显示隐藏是通过控制CSS的display决定dom节点的显示和隐藏。v-if通过控制dom节点的渲染与否实现元素的显示和隐藏。 在vue中&#xff0c;template标签不参与页面渲染&#xff0c;也不会破坏代码的层级结构&#xff0c;所以多和v-if结合控制元素的显示隐…...

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

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

Spring 概念

Spring 是一个功能强大、灵活且广泛使用的 Java 企业级开发框架&#xff0c;它诞生于 2003 年&#xff0c;由 Rod Johnson 创建&#xff0c;初衷是简化 Java EE 的开发过程。 一、Spring 是什么&#xff1f; 简单来说&#xff1a; Spring 是一个轻量级的 Java 开发框架&#…...

状态机思想编程

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