Redis 数据结构源码剖析(SDS、Dict、Skiplist、Quicklist、Ziplist)

Redis 数据结构源码剖析(SDS、Dict、Skiplist、Quicklist、Ziplist)

在这里插入图片描述

1. 前言

Redis 的高性能与丰富数据结构密切相关。
核心数据结构包括:

  • SDS(Simple Dynamic String):字符串底层实现。
  • Dict(哈希表):Key-Value 映射。
  • Skiplist(跳表):有序集合底层结构。
  • Quicklist(快速列表):List 的底层实现。
  • Ziplist / Listpack(压缩列表):小型集合或 Hash 的紧凑存储。

这些结构各有特点,支持 高效读写、低内存消耗动态扩展


2. SDS(Simple Dynamic String)

2.1 SDS 概念

Redis 字符串不是简单 C 字符数组,而是 SDS,支持 动态扩容、二进制安全、O(1) 获取长度

2.2 SDS 结构

struct sdshdr {int len;      // 已使用长度int free;     // 剩余可用空间char buf[];   // 字符串内容(实际数据)
};

2.3 特性

  • len:快速获取字符串长度,避免 O(n) strlen()
  • free:预留空间,减少扩容次数。
  • 二进制安全:可存储 \0

2.4 核心操作

s = sdsnew("hello");       // 创建
s = sdscat(s, " world");   // 拼接
sdsfree(s);                // 释放

SDS 的扩容采用 指数增长,保证拼接操作的均摊 O(1) 性能。


3. Dict(哈希表)

3.1 Dict 概念

Redis 的 Hash 类型、数据库全局 Key-Value 都使用 Dict。

3.2 Dict 结构

typedef struct dictEntry {void *key;void *val;struct dictEntry *next;   // 冲突链表
} dictEntry;typedef struct dictht {dictEntry **table;unsigned long size;unsigned long sizemask;unsigned long used;
} dictht;typedef struct dict {dictht ht[2];   // 支持渐进式 rehashlong rehashidx;
} dict;

3.3 特性

  • 渐进式 rehash:避免大表扩容阻塞主线程。
  • 冲突处理:链表法(拉链法)。
  • 可定制化:支持自定义 hash 函数与 key/value dup/free 函数。

4. Skiplist(跳表)

4.1 Skiplist 概念

跳表是 Redis 有序集合(ZSet) 的底层结构。

  • 支持快速 范围查询按分数排序
  • 查找、插入、删除平均 O(log n)。

4.2 Skiplist 结构

typedef struct zskiplistNode {sds ele;double score;struct zskiplistNode *backward;struct zskiplistLevel {struct zskiplistNode *forward;unsigned int span;} level[];
} zskiplistNode;typedef struct zskiplist {struct zskiplistNode *header, *tail;unsigned long length;int level;
} zskiplist;
  • score:排序依据。
  • forward:多层索引,提高查找效率。
  • span:用于计算排名。

5. Quicklist(快速列表)

5.1 Quicklist 概念

Redis 3.2 之后,List 类型底层使用 Quicklist 替代双端链表 + ziplist。

5.2 Quicklist 结构

typedef struct quicklistNode {struct quicklistNode *prev, *next;unsigned char *zl;   // ziplist 存储多个元素unsigned int sz;     // ziplist 大小
} quicklistNode;typedef struct quicklist {quicklistNode *head, *tail;unsigned long count; // 元素总数int fill;            // ziplist fill factor
} quicklist;

5.3 特性

  • 每个节点存储多个元素,减少链表节点开销。
  • 内置 压缩策略,节省内存。
  • 支持双向访问,O(1) 插入/删除。

6. Ziplist / Listpack

6.1 Ziplist 概念

  • 小型集合、Hash、ZSet 会用 Ziplist 存储。
  • 连续内存压缩存储,减少内存碎片。

6.2 Ziplist 结构

[zlbytes][zltail][zllen][entry][entry]...[zlend]
  • zlbytes:总字节数
  • zltail:最后一个元素偏移
  • zllen:元素数量
  • entry:元素内容,支持整数压缩

6.3 特性

  • 对小对象极致节省内存
  • 查询效率较低,但适合小规模数据

7. 数据结构选择策略

数据类型小规模大规模
Stringembstrraw
Listziplistquicklist
Hashziplistdict
Setintsetdict
ZSetziplistskiplist+dict

Redis 会根据 元素个数、元素长度、配置阈值 自动升级底层数据结构。


8. 小结

本文分析了 Redis 核心数据结构源码:

  1. SDS:高效字符串存储,支持 O(1) 获取长度和动态扩容。
  2. Dict:高性能哈希表,支持渐进式 rehash。
  3. Skiplist:有序集合底层结构,支持快速排序和范围查询。
  4. Quicklist:List 的底层实现,支持压缩和双向访问。
  5. Ziplist / Listpack:小型集合压缩存储,节省内存。

📌 理解这些数据结构是 Redis 高性能和内存优化的核心,也是所有命令执行和对象操作的基础。


在这里插入图片描述

下一篇可以写 Redis 内存优化与管理机制(内存碎片、LRU、惰性删除、内存回收策略),这样 Redis 的内存管理体系就完整了。

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

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

相关文章

无人机图传系统的功能解析和技术实现原理

无人机图传系统要将机载摄像头捕捉到的画面以尽可能低的时延、尽可能高的清晰度、稳定可靠地送达地面操作员或指挥中心,进而驱动现场行动。为此,核心功能可以从四个维度来解构:实时性、画质与稳定性、覆盖与冗余、以及安全协同。实时性要求在…

微服务网关的bug

从你提供的Eureka控制台信息来看,SPRINGCLOUD-PRODUCT已成功注册到Eureka,且状态为UP(实例地址localhost:springcloud-product:8082),排除了“服务未注册”“实例离线”的基础问题。但仍报“负载均衡无可用服务”&…

LeetCode:2.字母异位词分组

目录 1.字母异位词分组 1.字母异位词分组 对于这道题来说&#xff0c;关键的地方在于字母异位词他们排序后的字符串完全相等&#xff0c;所以我们可以通过哈希表来建设一个字符串和其排序相同的字符串数组的映射关系 class Solution { public:vector<vector<string>…

SwiftData3 一剑封喉:WWDC25 的“数据剑谱”精讲,让 Core Data 老侠原地退休

文章目录每日一句正能量一、开场白&#xff1a;老兵的隐痛二、SwiftData3 新剑谱总览三、亮剑&#xff1a;30 行代码搭一个「跨端秒级同步」的收藏夹1. 铸剑&#xff1a;声明模型2. 开锋&#xff1a;初始化容器3. 出招&#xff1a;SwiftUI7 直接绑四、进阶剑气&#xff1a;Char…

微服务-nacos服务中心

单体与微服务 单体架构&#xff1a;项目所有功能都在一个 war 包 /jar 包里&#xff0c;像商城的订单、库存、会员、支付等服务&#xff0c;都打包在一起&#xff0c;部署在 Tomcat 服务器&#xff0c;数据存在 MySQL。 优点&#xff1a;开发简单&#xff0c;易于理解和维护&am…

嵌入式硬件——IMX6ULL 裸机LED点亮实验

一. 实验准备 基于正点原子 IMX6ULL-Mini 开发板&#xff0c;实现 LED 周期性闪烁功能&#xff0c;需完成环境搭建与硬件原理确认两大核心准备工作。 1.1 开发环境搭建 需在Windows和Ubuntu中安装工具&#xff0c;确保文件传输、交叉编译、代码编辑功能正常。1.1.1 跨系统文件传…

深度学习之PyTorch基本使用(一)

一、PyTorch简介与安装1.核心概念PyTorch 是一款 Python 深度学习框架&#xff0c;其核心是张量&#xff08;Tensor&#xff09; —— 元素为同一种数据类型的多维矩阵&#xff0c;以 “类” 的形式封装&#xff0c;内置了张量运算、处理等方法&#xff0c;是深度学习中数据存储…

SQLAlchemy -> Base.metadata.create_all(engine )详解

目录 一、核心作用 二、是否每次运行项目都会执行&#xff1f; 1. ​​典型场景​​&#xff08;推荐&#xff09; 2. ​​需要避免的情况​​ 三、最佳实践建议 1. ​​生产环境​​ 2. ​​开发/测试环境​​ 四、常见问题解答 Q1: 如果表结构改了&#xff0c;creat…

C++异步任务处理与消息可靠性保障指南:从基础到实战

在当今多核处理器普及的时代&#xff0c;程序性能和响应能力的提升成为开发者面临的核心课题。无论是高频交易系统的毫秒级响应需求、实时游戏引擎的流畅交互体验&#xff0c;还是网络服务器的高并发处理能力&#xff0c;异步编程都已成为突破性能瓶颈的关键技术[1]。作为高性能…

LazyForEach性能优化:解决长列表卡顿问题

本文将深入解析HarmonyOS中LazyForEach的工作原理、性能优势、实战优化技巧及常见问题解决方案&#xff0c;帮助你构建流畅的长列表体验。 1. LazyForEach 核心优势与原理 LazyForEach 是鸿蒙ArkUI框架中为高性能列表渲染设计的核心组件&#xff0c;其核心设计思想基于动态加载…

Spring Boot 全栈优化:服务器、数据、缓存、日志的场景应用!

Spring Boot以其“开箱即用”闻名&#xff0c;但默认配置往往在高并发场景下成为瓶颈&#xff1a;Tomcat线程堵塞、数据库连接耗尽、缓存命中率低下、日志洪水般淹没磁盘。想象一个电商微服务&#xff0c;峰值流量下响应迟钝&#xff0c;用户流失——这不是宿命&#xff0c;而是…

Leetcode sql 50 ~5

select product_idfrom Productswhere low_fats Y and recyclable Y;SQL 规定&#xff1a;null 的比较必须用 is null 或 is not null&#xff0c;不能用普通的等号&#xff08;&#xff09;。# Write your MySQL query statement below select name from Customer where ref…

C#高并发与并行理解处理

目录 1.什么是IO密集型任务/CPU密集型任务 2.高并发概念和技术实现 2.并行&#xff08;Parallelist&#xff09;概念和技术实现 4.核心区别对比 1.什么是IO密集型任务/CPU密集型任务 1.IO密集型任务&#xff1a; 定义&#xff1a;任务核心逻辑不依赖CPU计算&#xff0c;而是…

正点原子STM32F407 U盘升级程序(IAP)OTA Bootloader APP USB升级+FATFS+USB Host

正点原子STM32F407 U盘升级程序&#xff08;IAP&#xff09;OTA Bootloader APP USB升级FATFSUSB HostChapter0 解决STM32 Bootloader跳转APP失败问题问题背景问题描述问题解决原APP跳转的函数为&#xff1a;修改APP程序main入口处Chapter1 MDK如何生成*.bin格式的文件Chapter2…

MySQL 8.0 在 Ubuntu 22.04 中如何将启用方式改为mysql_native_password(密码认证)

MySQL 8.0 在 Ubuntu 22.04 中默认启用了 auth_socket 认证方式(而非密码认证),导致 mysql_secure_installation 跳过了 root 密码设置。这会直接影响后续用 Navicat 连接 MySQL(因为 Navicat 需要密码登录),必须手动调整 root 用户的认证方式并设置密码。 核心问题:au…

七层网络协议-面试

七层网络协议概述七层网络协议&#xff0c;即OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;是由国际标准化组织&#xff08;ISO&#xff09;提出的网络通信框架。它将网络通信过程划分为七个层次&#xff0c;每一层负责特定的功能&#xff0c;并通…

【Blender】二次元人物制作【二】:五官的制作

一、制作眼睛 选中眼眶内部的一圈线。shiftD复制出来调整成圆形&#xff0c;然后F快捷键填充将眼睛放在眼框内合适的位置&#xff0c;并用i键进行几次内插&#xff0c;做出瞳孔&#xff0c;并且将内部的眼瞳做得稍微向内凹陷一点。二、制作睫毛 选中眼眶上半部分的面&#xff0…

Deepin 25 系统安装 Docker:完整教程 + 常见问题解决

Deepin 25 系统安装 Docker&#xff1a;完整教程 常见问题解决 作为基于 Debian 的 Linux 发行版&#xff0c;Deepin 25 因系统目录&#xff08;如/usr&#xff09;默认只读的特性&#xff0c;安装 Docker 时需特殊处理 GPG 公钥存储路径。本文结合社区实践&#xff0c;整理出…

Redis MySQL小结

问题1&#xff1a;Redis为什么高效&#xff1f;答&#xff1a;基于内存&#xff0c;reactor&#xff0c;value的数据组织&#xff08;五种数据结构&#xff09;&#xff0c;KV的数据组织方式&#xff08;渐进hash&#xff09;问题2&#xff1a;跳表是什么&#xff1f;和红黑树的…

Flink on YARN 实战问题排查指南(精华版)

一、客户端常见问题速查 ‌1. JAR加载失败终极解法‌报错提示&#xff1a;"Could not build the program from JAR file" 核心原因&#xff1a;80%的情况是Hadoop依赖缺失 黄金配置&#xff1a;export HADOOP_CONF_DIR${HADOOP_HOME}/etc/hadoop export HADOOP_CLASS…