Redis7 底層數據結構解析

Redis底層數據結構深度解析(基于Redis 7.2.5)

本文深入剖析Redis核心數據類型的底層實現機制,涵蓋String、Hash、List、Set、Zset的實現原理及版本演進差異。

一、Redis數據存儲核心機制

Redis所有數據以redisObject結構統一封裝:

typedef struct redisObject {unsigned type:4;      // 數據類型(string, hash等)unsigned encoding:4;  // 底層編碼(int, embstr等)unsigned lru:LRU_BITS; // 緩存淘汰策略信息int refcount;         // 引用計數void *ptr;            // 指向實際數據的指針
} robj;
  • 查看指令
    • TYPE key:返回數據類型
    • OBJECT ENCODING key:查看底層編碼

二、String類型底層結構

三種編碼方式:

  1. int編碼
    • 條件:值為整數字符串(可轉為long)
    • 特點:ptr直接存儲整數值(省去指針開銷)
  2. embstr編碼
    • 條件:字符串長度 ≤ 44字節
    • 特點:內存連續分配,RedisObject與SDS共享內存
  3. raw編碼
    • 條件:字符串長度 > 44字節
    • 特點:RedisObject與SDS分離存儲

SDS(Simple Dynamic String)

動態字符串結構,解決C字符串缺陷:

struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len;         // 已用長度uint8_t alloc;       // 總空間unsigned char flags; // 類型標識char buf[];          // 數據存儲
};

優勢:

  • O(1)復雜度獲取長度
  • 二進制安全(允許存儲\0
  • 預分配減少內存重分配

三、Hash類型底層結構

編碼切換規則:

條件編碼方式
所有鍵值對數量 ≤ hash-max-listpack-entries (默認512) 且 所有值長度 ≤ hash-max-listpack-value (默認64字節)listpack
任一條件不滿足hashtable

Listpack(替代Redis6的ziplist)

連續內存結構解決ziplist連鎖更新問題:

字段說明
total-bytes (4B)總字節數
num-elements (2B)元素數量
entry (變長)數據節點(每個鍵值對)
end-byte (1B)結束標識(0xFF)

節點結構

[編碼類型][數據長度][實際數據]

→ 無需記錄前驅節點長度,避免連鎖更新


四、List類型底層結構

編碼規則:

  • listpack編碼:元素少且長度小
  • quicklist編碼:元素多或長度大(默認切換閾值:list-max-listpack-size = -2 即8KB)

Quicklist結構

雙向鏈表 + Listpack的復合結構:

typedef struct quicklist {quicklistNode *head;quicklistNode *tail;unsigned long count;     // 總元素數unsigned long len;       // 節點數...
} quicklist;typedef struct quicklistNode {struct quicklistNode *prev;struct quicklistNode *next;unsigned char *entry;    // 指向listpacksize_t sz;               // listpack字節大小...
} quicklistNode;

優勢:

  • 鏈表結構:高效增刪(O(1))
  • Listpack節點:內存連續,減少碎片

五、Set類型底層結構

編碼切換規則:

條件編碼方式
元素全為整數 & 元素數量 ≤ set-max-intset-entries (默認512)intset
元素數量 ≤ set-max-listpack-entries (默認128) 且 所有元素長度 ≤ set-max-listpack-value (默認64字節)listpack
任一條件不滿足hashtable

Intset整數集合

typedef struct intset {uint32_t encoding;  // 編碼方式(int16/int32/int64)uint32_t length;    // 元素數量int8_t contents[];  // 數據存儲
} intset;

特點:元素有序存儲,二分查找效率高


六、Zset類型底層結構

編碼切換規則:

條件編碼方式
元素數量 ≤ zset-max-listpack-entries (默認128) 且 所有值長度 ≤ zset-max-listpack-value (默認64字節)listpack
任一條件不滿足skiplist

Skiplist跳表

多層索引結構實現高效查找:

typedef struct zskiplistNode {sds ele;                         // 元素值double score;                    // 分值struct zskiplistNode *backward;  // 后退指針struct zskiplistLevel {struct zskiplistNode *forward; // 前進指針unsigned long span;          // 跨度} level[];                       // 層級數組
} zskiplistNode;

性能

  • 查詢/插入/刪除:平均O(logN)
  • 空間復雜度:O(N)

七、Redis版本數據結構對比

數據類型Redis 6Redis 7
stringSDSSDS
hashziplist + hashtablelistpack + hashtable
listquicklist + ziplistquicklist + listpack
setintset + hashtableintset + listpack + hashtable
zsetziplist + skiplistlistpack + skiplist

關鍵演進:Redis 7使用listpack全面替代ziplist,徹底解決連鎖更新問題。

附:Redis高性能核心要素

  1. 精細化數據結構:針對場景選擇最優編碼
  2. 內存連續存儲:SDS/listpack利用CPU緩存
  3. 惰性刪除:異步釋放避免阻塞
  4. 單線程模型:無鎖操作減少競爭
  5. IO多路復用:epoll/kqueue高效網絡處理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91473.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91473.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91473.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《C++初階之STL》【auto關鍵字 + 范圍for循環 + 迭代器】

【auto關鍵字 范圍for循環 迭代器】目錄前言:--------------- auto關鍵字 ---------------1. 什么是auto?2. 使用關鍵字auto時需要注意什么?3. 怎么使用auto關鍵字?--------------- 范圍for循環 ---------------1. 什么是范圍fo…

ionic 切換開關操作指南

ionic 切換開關操作指南 引言 在移動應用開發中,切換開關(Toggle)是一種常見的用戶界面元素,它允許用戶通過簡單的操作來開啟或關閉某個功能或設置。在Ionic框架中,切換開關提供了豐富的API和樣式,使得開發…

【筆記記錄-Linux文件權限與目錄結構詳解】

🌈個人主頁: Aileen_0v0 🔥熱門專欄: 華為鴻蒙系統學習|計算機網絡|數據結構與算法 ?💫個人格言:“沒有羅馬,那就自己創造羅馬~” 文章目錄目錄結構解析Summarypart3part4part5目錄結構解析 drwxr-xr-x 2 student student 4096 10月 8 2023…

【Complete Search】-基礎完全搜索-Basic Complete Search

文章目錄Solution - Maximum Distance涉及遍歷整個解空間的問題資料-resources 6 - Complete Search 在很多問題中(尤其是在 USACO Bronze 級別),只需檢查解空間中的所有可能情況就足夠了,比如所有元素、所有元素對、所有子集&…

神經網絡的層與塊

什么是層?什么是塊?在深度學習中,層(Layer) 和塊(Block) 是構建神經網絡的核心概念,尤其在 PyTorch、TensorFlow 等框架中,二者既緊密關聯又有明確分工。理解它們的定義、…

如何用Qt寫一個安卓Android應用

對于不會安卓開發的同胞來講(比如我),想要做一個安卓應用(.apk)使用Qt是一個不錯的方法,今天就來聊聊如何使用Qt結合C寫一個安卓應用。 首先我們得擁有一個Qt,我使用的是5.14.2版本的,新版本可直接到qt官網去下載qt.io,老版本的現在qt官網不支…

泰語OCR識別技術方案

一、痛點分析1.1 泰語文字特性帶來的挑戰復雜字符集:泰語有44個輔音字母、15個元音符號、4個聲調符號和10個數字,組合形式多樣上下疊加結構:泰文字符常在垂直方向疊加組合,增加分割難度無詞間空格:泰語單詞間無明確分隔…

MER-Factory:多模態情感識別與推理數據集自動化工廠工具介紹

🛠? 工具 如果這個項目對你有幫助,歡迎給 https://github.com/Lum1104/MER-Factory/ 倉庫點一個 Star 🌟 ,這對我們幫助很大 MER-Factory 提供交互式工具來幫助您管理數據和配置處理流水線。 調優儀表板 調優儀表板 是一個基…

Python基礎數據結構詳解:字符串、列表、元組和字典的常用方法

目錄 一、引言:為什么學習這些數據結構? 二、字符串(String)的常用方法 1. 基本操作 2. 查找索引 3. 大小寫轉換 4. 位置調整 5. 開頭和結尾檢查 6. 分割和連接 7. 刪除空白字符 8. 類型判定 9. 替換內容 字符串小結 …

Liunx練習項目5.1-周期化任務;時間同步服務;

1.系統周期化任務1.1 at命令的用法at 時間 指定在規定的時間上執行相應的操作,完成操作crtlD完成編輯一分鐘后輸入的指令完成,創建了file{1..5}的文件at -l 查看系統上面所有用戶的調度at -c 可以查看該任務的指令at -d 加編號可以刪除該任務at -v 可以…

小皮面板搭建pikachu靶場

一、搭建所需的工具 1.下載小皮面板 下載地址為:小皮面板(phpstudy) - 讓天下沒有難配的服務器環境! 2.下載靶場所需的文件 下載地址為:https://github.com/zhuifengshaonianhanlu/pikachu 二、環境的搭建 打開小皮面板,使用所…

使用aiohttp實現高并發爬蟲

使用aiohttp來編寫一個高并發的爬蟲,想法很不錯,現實很骨感。這里我們要知道,由于高并發可能會對目標服務器造成壓力,請確保遵守目標網站的robots.txt,并合理設置并發量,避免被封IP。 我將通過示例代碼&…

【Linux庖丁解牛】— 信號量ipc管理!

1. 并發編程概念鋪墊> 多個執行流【進程】看到同一份資源:共享資源。> 被保護起來的資源叫做臨界資源。> 在進程中,涉及臨界資源的程序段叫做臨界區。【說人話就是程序中訪問共享資源的代碼】> 什么是互斥:任何時刻,只…

Spring Boot全局異常處理詳解

原代碼:package com.weiyu.exception;import com.weiyu.pojo.Result; import com.weiyu.utils.ErrorFileResponseUtils; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import …

FHE技術將徹底改變在線隱私保護方式

1. 在線隱私的簡史 互聯網剛剛誕生時,所有的內容都是未加密的。人們通過一個特定的地址訪問網站,這個地址以“HTTP”開頭。當時,這并不是什么大問題,因為人們在線訪問的都是內容,而這些內容本身已經是公開的。但隨著電…

Cursor配置Java環境、創建Spring Boot項目

一:配置JDK和Maven cursor默認會讀取環境變量JAVA_HOME和MAVEN_HOME,如果沒有配置去找默認路徑~/.m2/settings.xml也可以手動指定:Ctrl Shift P 輸入"Preferences:Open User Settings(JSON)"打開settings.json文件,然…

win11添加無線顯示器(兩個筆記本實現雙屏)

前置條件: 兩個筆記本要要支持無線顯示器,支持藍牙; 1、自己重裝的win11系統,首先根據網上說明進去的時候,紅色顯示無無線投屏; 2、安裝網上操作,查看自己電腦是否支持無線投屏(是支…

【MAC技巧】Bash/Zsh切換失敗的故障排除

【MAC技巧】Bash/Zsh切換失敗的故障排除 Troubleshooting to Failure " chsh: no changes made" By JacksonML 在Mac電腦中,終端(Terminal)是常用的命令行工具,對開發和運維至關重要。 依照蘋果電腦的系統軟件迭代,終端中存有B…

卷積神經網絡-卷積的分類

卷積的定義卷積是圖像處理中最核心的操作之一,其本質是通過卷積核(濾波器)與圖像進行滑動窗口計算(像素值乘積之和),實現對圖像特征的提取、增強或抑制。一、二維卷積--針對二維矩陣進行處理1.1單通道見得最…

全網首發:使用GIT下載時崩潰退出,是因為機械硬盤

前面有幾篇文章,說是GIT下載會退出。開始以為是虛擬機問題。把家里的虛擬機復制到公司,照樣崩潰。后來認為是內存不足。昨天在家里下載代碼,也崩潰退出。心里覺得奇怪,試了一次,還是退出。差別在哪里?之前是…