(ZipList入門筆記一)ZipList的節點介紹

ZipList是 Redis 中一種非常緊湊、節省內存的數據結構 Ziplist(壓縮列表) 的內部內存布局。它被用于存儲元素較少的 List、Hash 和 Zset。

下面我們來詳細介紹每一個節點的含義:
在這里插入圖片描述

1. zlbytes (ziplist bytes)

  • 含義: 整個壓縮列表占用的總字節數。
  • 類型: 32位無符號整數(uint32_t),固定占用 4 個字節。
  • 作用: 這個字段記錄了 Ziplist 的總大小。有了它,程序無需遍歷整個列表就能知道其邊界,這在進行內存重分配(realloc)時非常有用,可以直接告訴內存管理器需要多大的空間。

2. zltail (ziplist tail)

  • 含義: 指向列表中最后一個元素(entry)的偏移量(offset)。
  • 類型: 32位無符號整數(uint32_t),固定占用 4 個字節。
  • 作用: 這個字段允許程序在 O(1) 的時間復雜度內定位到 Ziplist 的最后一個節點,而無需從頭遍歷。這使得從列表尾部進行 pop(彈出)等操作非常高效。

3. zllen (ziplist length)

  • 含義: 壓縮列表中的節點(entry)數量。
  • 類型: 16位無符號整數(uint16_t),固定占用 2 個字節。
  • 作用: 提供了在 O(1) 時間復雜度內獲取列表長度的能力。
  • 特殊情況: 由于它只有16位,最大只能表示 65535。如果 Ziplist 中的節點數超過或等于 65535,這個字段會被設置為特殊值 65535 (FFFF)。在這種情況下,要獲取真實長度,就必須遍歷整個列表來統計,時間復雜度會退化為 O(N)。不過,Ziplist 的設計初衷就是用于存儲少量數據,所以這種情況很少見。

4. entry (列表節點)

  • 含義: 這部分是 Ziplist 的核心,用來存儲實際的數據元素。圖中的 entry1, entry2, entry3 代表連續存放的多個節點。
  • 結構: 每個 entry 自身的結構也非常精巧,它由三個部分組成:
    1. previous_entry_length (前一節點的長度): 這個字段記錄了前一個節點所占用的總字節數。它的存在是實現從后向前遍歷 Ziplist 的關鍵。通過當前節點的地址減去這個長度,就可以得到前一個節點的起始地址。這個字段本身的長度是可變的(1字節或5字節),以節省空間。
    2. encoding (編碼): 這個字段指明了 content 部分的數據類型(是字符串還是整數)以及它的長度。編碼字段本身也是變長的,通過不同的二進制位模式來表示不同的編碼方式,實現了極致的空間優化。
    3. content (內容): 實際存儲的數據,可以是整數或一個字節數組(字符串)。其長度由 encoding 字段決定。

5. zlend (ziplist end)

  • 含義: 壓縮列表的結束標記。
  • 類型: 8位無符號整數(uint8_t),固定占用 1 個字節。
  • 值: 它的值永遠是 255 (二進制 11111111,十六進制 0xFF)。
  • 作用: 作為一個明確的終止符,當程序遍歷列表時,一旦遇到這個值,就知道已經到達了列表的末尾。

總結

Ziplist 的設計精髓在于 “緊湊”。它不像常規鏈表那樣為每個節點都使用前后指針(在64位系統上,一個指針就占8字節),而是通過存儲前一節點的長度 (previous_entry_length) 和利用連續內存布局,實現了雙向遍歷,從而極大地節省了內存。圖中 zlbytes, zltail, zllen 這三個頭部字段,共同為這個緊湊的結構提供了高效的宏觀操作能力。

下一篇:

(ZipList入門筆記二)為何ZipList可以實現內存壓縮,可以詳細介紹一下嗎

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

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

相關文章

Unix 發展史概覽

這里是一個簡明清晰的 Unix 發展史概覽,涵蓋從起源到現代的重要節點和演變過程。Unix 發展史概覽 1. Unix 起源(1969年) 貝爾實驗室:Ken Thompson 和 Dennis Ritchie 開發出 Unix 操作系統。最初設計目標:簡潔、可移植…

基于coze studio開源框架二次定制開發教程

目錄 一、 項目介紹 1.1 什么是Coze Studio 1.2 功能清單 1.3對比商業版本 二、 功能定開說明 2.1 技術棧簡介 2.2 項目架構

RHCE認證題解

考前說明請勿更改 IP 地址。DNS 解析完整主機名,同時也解析短名稱。? 所有系統的 root 密碼都是 redhat? Ansible 控制節點上已創建用戶賬戶 devops。可以使用 ssh 訪問? 所需的所有鏡像保存在鏡像倉庫 utility.lab.example.compodman 可使用下述賬號登錄使用 用…

調用com對象的坑

1、諫言 最近我在弄64位調用32位dll的問題,在幾種IPC之間,最后考慮了調用COM 畢竟我們只在windows平臺 2、第一坑–修改編譯后都需要重新注冊,注冊表 一直以為只需要編譯就好了,結果調用沒反應、報錯什么的,需要先撤銷…

【Python】PyQt 實現 TreeWidget 多級聯動選擇邏輯,打造素材搜索自定義樹形控件!

在開發自己的寫作素材管理工具時,我遇到了一個非常典型但又略顯棘手的 UI 問題: ?? 如何實現一個“可自由勾選分類標簽”的樹形結構界面,支持父子節點自動聯動勾選,提升用戶體驗? 雖然 PyQt 的 QTreeWidget 是構建多層分類結構的好幫手,但默認卻不具備父子節點的自動級…

27-數據倉庫與Apache Hive-2

1.數倉開發語言概述 理論上來說,任何一款編程語言只要具備讀寫數據、處理數據的能力,都可以用于數倉的開發。比如大家耳熟能詳的C、java、Python等; 關鍵在于編程語言是否易學、好用、功能是否強大。遺憾的是上面所列出的C、Python等編程語言…

軟件測試——接口自動化

測試中的自動化分為兩類: 1.ui自動化(web、移動端)2.接口自動化 前面的博客中,我們已經講解了web端的ui自動化,感興趣的同學可以去看看:軟件測試——自動化測試常見函數_自動化測試代碼編寫-CSDN博客 今…

Flask一個用戶同時只能在一處登錄實現

場景:web頁面如果多人用同一賬號同時登錄操作,可能會導致數據等的混亂甚至出現故障。并且可能損害開發者的利益。為此,本篇文章就講下如何實現同一賬戶同時僅能一個地方登錄操作。 思路:1. 用戶登陸時生成token(uuid.u…

聯發科芯片組曝高危漏洞:越界寫入缺陷危及智能手機與物聯網設備安全

漏洞概況全球領先的芯片組制造商聯發科(MediaTek)近日發布最新產品安全公告,披露了影響其智能手機、物聯網設備及其他嵌入式系統芯片的多項安全漏洞。高危漏洞分析CVE-2025-20696 作為公告披露的首個且最嚴重的漏洞,該高危缺陷源于…

Android與Flutter混合開發:頁面跳轉與通信完整指南

Android與Flutter混合開發:頁面跳轉與通信完整指南 一、Android跳轉Flutter頁面的實現方式 1. 基礎跳轉方法 (1)使用全新引擎跳轉(每次新建) startActivity(FlutterActivity.withNewEngine().initialRoute("/home…

Web存儲技術詳解:sessionStorage、localStorage與Cookie

一、核心特性對比特性CookielocalStoragesessionStorage存儲大小4KB左右5-10MB5-10MB生命周期可設置過期時間永久存儲(除非手動清除)會話期間有效(標簽頁關閉即清除)作用域同源的所有窗口同源的所有窗口僅當前標簽頁自動發送每次H…

3. 為什么 0.1 + 0.2 != 0.3

總結 底層是二進制實現概述 在 JavaScript 中,0.1 0.2 的結果并不是精確的 0.3,而是 0.30000000000000004。這個現象并不是 JavaScript 的“bug”,而是由于浮點數在計算機底層的二進制表示方式導致的精度丟失問題。一、計算機如何表示小數&a…

股票數據接口哪家好?專業評測各主流接口的優勢與不足

Python股票接口實現查詢賬戶,提交訂單,自動交易(1) Python股票程序交易接口查賬,提交訂單,自動交易(2) 股票量化,Python炒股,CSDN交流社區 >>> 股票…

如何用分布式架構視角理解宇宙穩定性?從精細調參到微服務的類比思考

在調試一段多線程分布式代碼時,我忽然意識到一個不合理的事實:為什么現實世界這么穩定?為什么沒有“宇宙藍屏”或“感知崩潰”?為什么每天醒來,我們還能看到同樣的物理規律、感知同一個自我?站在程序員的角…

游戲畫面總是卡頓怎么辦 告別延遲暢玩游戲

玩游戲最讓人頭疼的問題之一就是畫面卡頓,影響操作流暢度與游戲體驗。卡頓可能由硬件性能、系統設置、網絡延遲等多種因素導致。本文將從不同角度出發,為你提供五個有效解決方法,幫助你快速提升游戲流暢度。 一、降低游戲畫質設置 高畫質雖然…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-郵箱重置密碼

在現代Web應用中,密碼重置功能是用戶賬戶安全體系中不可或缺的一部分。本文將詳細介紹如何使用Vue.js前端框架和SpringBoot后端框架實現一個基于郵箱驗證的密碼重置功能。功能概述本密碼重置功能包含以下核心流程:用戶輸入注冊郵箱系統發送驗證碼到該郵箱…

華為云云產品的發展趨勢:技術創新驅動數字化未來

近年來,隨著5G、人工智能(AI)、大數據、物聯網(IoT)和邊緣計算等新興技術的快速發展,全球云計算產業正迎來新一輪變革。作為中國領先的云服務提供商,華為云依托華為集團在ICT(信息與…

防御保護07-08

CIDR 可變長子網掩碼 VLSM 無類域間路由NET 用少量的私有地址替換大量的共有地址私網地址不能再互聯網上去使用、去分配。這里的互聯網指的是公網。服務器映射--用來使外部用戶能訪問私網服務器。靜態映射--公網地址和私網地址進行一對一的映射。地址池--中存在多個公網IP地址時…

PDF轉圖片工具技術文檔(命令行版本)

PDF轉圖片工具技術文檔(命令行版本) 1. 功能概述 本工具是一個基于PyMuPDF庫的PDF轉圖片命令行工具,能夠: 通過命令行參數接收PDF文件路徑將PDF的每一頁轉換為PNG格式的圖片自動創建輸出目錄(./static)保存…

k8s+isulad 國產化技術棧云原生技術棧搭建1-VPC

為響應政策,最近在搗鼓國產化云原生平臺的搭建。在搭建過程中遇到了問題記錄下來,以備后續查找。 我選用了中國電子云的云平臺來搭建K8S集群,選用的技術棧是華為開源的openeulerk8sisulad框架,參考官網文檔資料:iSula…