【Redis原理篇】五大基本數據類型的底層編碼方式

上文:redis底層數據結構

String底層結構

一、編碼方式

1.int編碼
  • **適用范圍:**64位整數(long

  • **實現:**直接將數據存儲在redisObjectptr指針位置。

  • 內存布局:

    在這里插入圖片描述

2.embstr編碼
  • **適用條件:**字符串大小<44字節

    • **實現:**將redisObjectSDS分配在連續內存中。
  • 內存布局:

    在這里插入圖片描述

    • redisObject (16B)
      SDS頭 (3B) 
      字符串數據 (44B)  
      結尾'\0' (1B) 
      
    • 總占用:16 + 3 + 44 + 1 = 64字節(剛好利用jemalloc(按2的次方分配內存)的64B內存塊,減少碎片)。

  • 特點

    • 內存連續,訪問高效(減少CPU緩存缺失)。
    • 只讀設計,修改時自動轉為raw編碼。
3.raw編碼
  • 適用條件:字符串長度 > 44字節或含二進制數據。
  • 實現redisObjectSDS分兩次分配內存,ptr指向獨立的SDS結構。
  • 內存布局:在這里插入圖片描述

二、編碼轉換場景

1.int → raw

執行非整數操作(如APPEND非數字字符)。

2.embstr → raw

修改embstr字符串(因embstr內存不可變)。

List底層結構

一、List的底層演進

Redis版本底層結構特點
??.0ziplist 或 linkedlist小數據用ziplist(內存緊湊),大數據用linkedlist(操作高效)
3.0~3.2quicklist(過渡階段)初步引入分段ziplist設計
≥3.2quicklist(默認統一實現)每個節點為ziplist,通過雙向鏈表連接,平衡內存與性能

Set底層結構

一、編碼方式

1.intset
  • 適用條件:
    • 所有元素均為 整數(int64_t 范圍)。
    • 元素數量 ≤ set-max-intset-entries(默認 512)。
  • 特點
    • 內存緊湊:無指針開銷,連續存儲整數。
    • 自動升級:插入超出當前編碼范圍的整數時,升級為更大編碼。
    • 二分查找:元素有序,查找時間復雜度 O(log n)
  • 缺點:
    1. 不支持非整數類型元素
      intset 設計初衷是存儲整數,只能保存整數。如果嘗試往intset里添加非整數類型的數據(如字符串、浮點數等),Redis 會將 intset 升級為 hashtable 來存儲。
    2. 升級操作開銷大
      當插入的新元素類型比 intset 現有元素類型長時,需要進行升級操作。整個升級過程涉及大量內存操作和數據類型轉換,時間復雜度為 O ( N ) O(N) O(N),在大數據量場景下,會帶來較大性能開銷。
    3. 查找效率在數據量增大時降低
      intset 內部使用有序數組存儲元素,查找元素時采用二分查找算法,平均時間復雜度為 O ( l o g N ) O(log N) O(logN)。雖然二分查找效率較高,但隨著元素數量 N 不斷增加,查找時間也會相應變長。相比哈希表(平均查找時間復雜度為 O ( 1 ) O(1) O(1)),在大數據量場景下,intset 的查找效率會處于劣勢。
    4. 插入和刪除操作效率問題
      插入和刪除元素時,為了保持數組的有序性,需要移動大量元素。插入或刪除操作的平均時間復雜度為 O ( N ) O(N) O(N),,在大數據量場景下,頻繁的插入和刪除操作會嚴重影響性能
2.dict(hashtable)
  • 適用條件

    • 元素包含 非整數
    • 元素數量 > set-max-intset-entries
  • 結構設計在這里插入圖片描述

  • 特點

    • O(1) 時間復雜度:插入、刪除、查找均高效且無intset升級操作。
    • 內存開銷大:每個元素需存儲 Entry 結構(鍵指針 + next 指針)。

二、編碼轉換機制

1. intset → hashtable
  • 觸發條件
    • 插入 非整數元素
    • 元素數量超過 set-max-intset-entries

三、內存與性能對比

維度intsethashtable
內存占用低(無指針,連續存儲)高(Entry 結構 + 指針)
插入性能O(n)(需維護有序性)O(1)(平均)
查找性能O(log n)(二分查找)O(1)(哈希查找)
適用場景小規模純整數集合大規模或含非整數元素的集合

ZSet底層結構

一、編碼方式

1. ziplist(壓縮列表)
  • 適用條件

    • 元素數量 ≤ zset-max-ziplist-entries(默認 128)。
    • 所有元素值(member)長度 ≤ zset-max-ziplist-value(默認 64 字節)。
  • 存儲方式

    • 元素(member)和分數(score)成對存儲,按分數升序排列。

    • 結構示例:

      在這里插入圖片描述

      特點

    • 內存緊湊:連續內存塊存儲,無指針開銷。

    • 插入/刪除低效:需重分配內存并移動數據,時間復雜度 O(n),大數據量場景下性能低。

2. skiplist(跳躍表) + dict(哈希表)
  • 適用條件
    • 元素數量或值大小超過上述閾值。
  • 結構設計
    • 跳躍表(zskiplist)
      • 按分數排序,支持 O(log n) 的插入、刪除和范圍查詢。
      • 節點結構包含成員(member)、分數(score)、多層前向指針。
    • 哈希表(dict)
      • 鍵為成員(member),值為分數(score),支持 O(1) 的成員查找。
  • 協作機制
    • 插入:同時向跳躍表和哈希表插入數據,保證一致性。
    • 查詢:哈希表快速定位分數(zscore),跳躍表處理范圍操作(zrange zrevrange zrangebyscore)。
  • 特點
    • 查詢效率高
    • 內存開銷大

二、編碼轉換機制

  • ziplist → skiplist
    • 觸發條件:插入元素導致數量或值大小超限。
    • 過程:遍歷 ziplist,將所有元素插入跳躍表和哈希表。

Hash底層結構

Hash底層采用的編碼與Zset基本一致,只需要把排序有關的SkipList去掉即可。

一、編碼方式

1.ziplist
  • 適用條件
    • 字段數量 ≤ hash-max-listpack-entries(默認 512)。
    • 每個字段的值長度 ≤ hash-max-listpack-value(默認 64 字節)。
  • 結構特點
    • 內存緊湊:連續存儲字段-值對,無指針開銷。
    • 順序存儲:字段和值按添加順序排列,適合小數據量。
    • 快速遍歷:支持線性遍歷,但隨機訪問需順序查找。
  • 操作限制
    • 插入/刪除低效:需內存重分配和數據移動,時間復雜度 O(n)。
    • 自動轉換:超出閾值時轉為hashtable。
2.hashtable(字典dict)
  • 適用條件
    • 字段數量或值大小超過listpack/ziplist閾值。
  • 結構設計
    • 哈希表:使用鏈地址法解決沖突,每個哈希節點存儲字段和值的指針。
    • 快速操作
      • 查找/插入/刪除:平均 O(1) 時間復雜度。
      • 支持大規模數據:動態擴容縮容,適應數據增長。
  • 內存開銷
    • 每個字段需額外存儲指針和哈希表元數據,內存占用較高。

二、編碼轉換機制

  • listpack/ziplist → hashtable
    • 觸發條件:字段數超限或單個值超長。

三、內存結構

在這里插入圖片描述

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

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

相關文章

自動編碼器 潛在空間 Autoencoders 視頻截圖

【雙語】Autoencoders_嗶哩嗶哩_bilibili 【雙語】Autoencoders_嗶哩嗶哩_bilibili

ZLG USBCANFD python UDS刷寫腳本

文章目錄 概述python UDS 刷寫腳本UI交互界面概述 在實際工作中,有使用周立功的UDSCANFD設備,用來收發CAN數據和UDS on CAN的診斷測試或者UDS on CAN的ECU升級。上位機使用ZCANPro,軟件自帶ECU刷新界面,可以編輯UDS服務,加載升級文件等,能用是能用,但是仍不能滿足一些特…

線程安全問題的成因

前言 大家晚上好呀~~ 今天學習了線程不安全問題的成因。線程安全問題是十分重要的知識點&#xff0c;我想把我所學的與大家分享一波&#xff0c;希望可以幫助到有需要的人&#xff0c;同時加深自己對于線程安全問題的理解。 分析過程如下 結語 今天心情還不錯~ 要堅持持續…

C++可變參數宏定義語法筆記

1. 基礎語法 定義格式&#xff1a; #define MACRO_NAME(fixed_args, ...) macro_body#define LOG(fmt, ...) printf(fmt, __VA_ARGS__) LOG("Value: %d, Name: %s", 42, "Alice"); // 展開為 printf("Value: %d, Name: %s", 42, "Alice&q…

mongodb安裝啟動

這里寫自定義目錄標題 安裝包下載安裝后文件目錄列表bin目錄下 mongod 可以對mongodb 進行啟動等操作 環境變量配置創建數據目錄&#xff0c;日志目錄啟動參數配置啟動 mongodbweb頁面訪問&#xff0c;檢查服務啟動是否正常可視化工具連接mongodb創建 database創建collection查…

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3562. Maximum Profit from Trading Stocks with Discounts 1. 解題思路 這一題沒有搞定&#xff0c;思路上整體走偏了&#xff0c;看了一下別人的解答&…

【Redis】第2節|Redis基本數據類型

一、基礎數據結構 1. String&#xff08;字符串&#xff09; 特點&#xff1a;二進制安全&#xff0c;支持字符串、數值存儲&#xff0c;原子性操作。核心操作&#xff1a; SET key value # 存儲鍵值對 GET key # 獲取值 INCR key # 數值…

用matlab提取abaqus odb文件中的節點信息

在MATLAB中提取Abaqus ODB文件中的節點信息&#xff0c;可以通過以下幾種方法實現&#xff1a; 方法1&#xff1a;使用MATLAB的ABAQUS Interface工具箱 https://wenku.csdn.net/answer/77axwtqnys 可以參考這個 MATLAB的ABAQUS Interface工具箱提供了直接讀取ODB文件的功能。…

【Java】異常處理

1.異常的概念 在程序運行時&#xff0c;打斷正常程序流程的不正常情況分兩類: 1.錯誤(Error)&#xff1a;應用程序無法捕獲的嚴重問題(自己無法處理) 例&#xff1a; 虛擬機相關的問題&#xff0c;如虛擬機崩潰、動態鏈接失敗、低層資源錯誤等 總是不受編譯器檢查的&#xff0…

Linux(Centos 7.6)命令詳解:tar

1.命令作用 命令tar將許多文件一起保存到單個磁帶或磁盤存檔中&#xff0c;并且可以從存檔中恢復單個文件(GNU tar saves many files together into a single tape or disk archive, and can restore individual files from the archive.)。 2.命令語法 Usage: tar [OPTION.…

企業網絡綜合實訓

企業網絡綜合實訓 任務描述&#xff1a; 公司的中心機房、辦公區一和辦公區二位于同一園區。要求各大樓之間要互通&#xff0c;并且均能訪問Internet&#xff1b;同時公司業務需要對外拓展&#xff0c;需要在Internet數據中心機房部署一臺對外提供DNS和Web站點服務的服務器。…

8天Python從入門到精通【itheima】-41~44

目錄 41節-while循環的嵌套應用 1.學習目標 2.while循環的偽代碼和生活情境中的應用 3.圖片應用的代碼案例 4.代碼實例【Patrick自己親手寫的】&#xff1a; 5.whlie嵌套循環的注意點 6.小節總結 42節-while循環的嵌套案例-九九乘法表 1.補充知識-print的不換行 2.補充…

探索Linux互斥:線程安全與資源共享

個人主頁&#xff1a;chian-ocean 文章專欄-Linux 前言&#xff1a; 互斥是并發編程中避免競爭條件和保護共享資源的核心技術。通過使用鎖或信號量等機制&#xff0c;能夠確保多線程或多進程環境下對共享資源的安全訪問&#xff0c;避免數據不一致、死鎖等問題。 競爭條件 競…

《Stable Diffusion 3.0企業級落地指南》——技術賦能與商業價值的深度融合實踐

Stable Diffusion 3.0&#xff08;SD3&#xff09;作為當前多模態生成式AI技術的集大成者&#xff0c;憑借其創新的擴散Transformer架構&#xff08;DiT&#xff09;、流匹配&#xff08;Flow Matching&#xff09;技術以及超分辨率生成能力&#xff0c;正在重塑企業內容生產的…

基于本地模型+多級校驗設計的高效緩存,有效節省token數量(有點雞肋doge)。

前言 我是基于token有限而考慮的一個省錢方案&#xff0c;還能夠快速返回結果&#xff0c;但是劣勢也很明顯&#xff0c;設計不好容易出問題&#xff0c;就如下面所介紹的語義飄逸和緩存污染&#xff0c;我認為在自己學習大模型的過程用來省錢非常可以&#xff0c;再加上學習過…

網絡安全全知識圖譜:威脅、防護、管理與發展趨勢詳解

1 網絡安全基礎概念 1.1 什么是網絡安全 網絡安全是指通過技術、管理和法律等手段&#xff0c;保護計算機網絡系統中的硬件、軟件及其系統中的數據&#xff0c;不因偶然的或者惡意的原因而遭受到破壞、更改、泄露&#xff0c;確保系統連續可靠正常地運行&#xff0c;網絡服務不…

遠控安全進階之戰:TeamViewer/ToDesk/向日葵設備安全策略對比

【作者主頁】Francek Chen 【文章摘要】在數字化時代&#xff0c;卓越的遠程控制軟件需兼顧功能與體驗&#xff0c;包括流暢連接、高清畫質、低門檻UI設計、毫秒級延遲及多功能性&#xff0c;同時要有獨樹一幟的遠控安全技術&#xff0c;通過前瞻性安全策略阻擋網絡風險&#x…

Steam發布游戲過程的若干問題

我沒有想到在Steam發布游戲的過程會比做游戲的過程更困難&#xff0c;更惡心。 注冊Steamworks 稅務采訪 稅務采訪部分填的地址要和后面它們要求你發證件照片里的地址一樣。護照里因為沒有地址不會通過&#xff0c;我用的駕照里面有地址。沒有駕照可以用身份證。 應用準備界…

開搞:第四個微信小程序:圖上縣志

原因&#xff1a;我換了一個微信號來搞&#xff0c;因為用同一個用戶&#xff0c;備案只能一個個的來。這樣不行。所以我換了一個。原來注冊過小程序。現在修改即可。注意做好計劃后&#xff0c;速度備案和審核&#xff0c;不然你時間浪費不起。30元花起。 結構&#xff1a; -…

第三十七天打卡

知識點回顧&#xff1a; 過擬合的判斷&#xff1a;測試集和訓練集同步打印指標模型的保存和加載 僅保存權重保存權重和模型保存全部信息checkpoint&#xff0c;還包含訓練狀態 早停策略 作業&#xff1a;對信貸數據集訓練后保存權重&#xff0c;加載權重后繼續訓練50輪&#x…