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
英文地址,請注明出處:http://en.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…