Redis的ZSet對象底層原理——跳表

我們來聊聊「跳表(Skip List)」,這是一個既經典又優雅的數據結構,尤其在 Redis 中非常重要,比如 ZSet(有序集合)底層就用到了跳表。


🌟 跳表(Skip List)簡介

跳表是一種有序鏈表的升級版,通過引入多級“索引層”來加快查找效率。

? 主要特點:

特性說明
有序結構跳表維護的是一個按 key 排序的鏈表
多級索引類似高速公路入口,有“快捷路徑”
查找時間復雜度O(log n),跟平衡樹差不多
實現簡單不像紅黑樹那樣復雜
支持范圍查找很適合 Redis 中的范圍查詢場景

📐 跳表結構長啥樣?

假設我們有以下數據:[1, 3, 5, 7, 9]

我們構建跳表的過程如下(用 表示鏈表):

Level 2:      1  →         →       → 9
Level 1:      1  →    5    →       → 9
Level 0:      1  → 3 → 5 → 7 → 9

你可以把它想象成“高架橋+地面道路”的組合:

  • 第 0 層是原始鏈表,所有節點都在這里
  • 每上一層都是稀疏的抽樣索引,跳過一些中間節點,加快查找速度
  • 查找從最上層開始,逐層向下,“跳躍式前進”

🔍 查找過程舉例:查找 7

  1. 從最上層的 1 開始 → 跳到 9(9 > 7,不行)
  2. 回退到下一層 → 1 → 5 → 9(9 > 7,繼續往下)
  3. 到最底層 → 5 → 7 ? 找到!

→ 相比普通鏈表要順著一格一格走,跳表“跳著走”,很快!


📈 跳表的時間復雜度

操作時間復雜度
查找O(log n)
插入O(log n)
刪除O(log n)
空間復雜度O(n)

相比紅黑樹、AVL 樹,它的代碼實現更簡單、更易于維護。


💡 跳表的應用場景

場景用途
Redis ZSet支持快速插入、范圍查詢(如 zrangebyscore)
LSM-Tree(如 RocksDB)早期實現用過跳表
時間序列數據有序插入、范圍檢索
分布式系統一致性哈希環也可用跳表改進檢索速度

🔧 跳表 vs 紅黑樹

項目跳表紅黑樹
插入復雜度O(log n)O(log n),但旋轉邏輯復雜
實現難度簡單復雜(需維持平衡)
查詢性能相似相似
空間開銷稍高(多指針)較少

🧪 小技巧:跳表的層數怎么選?

跳表是隨機化結構,每次插入一個節點時,以一定概率(如 1/2)決定它是否晉升到上一層。

最常見的方式是:

while (random() < p && level < MAX_LEVEL) {level++;
}

所以跳表是一種「概率平衡」的數據結構。


📦 總結

優點缺點
實現簡單、性能穩定占用內存較多
支持快速范圍查找查詢時間有輕微波動
非常適合緩存、有序集合不如 B 樹適合磁盤存儲

在 Redis 中,跳表(Skip List) 主要用于 Sorted Set(有序集合,zset) 的底層實現。


? 使用跳表的場景:zset(有序集合)

Redis 的 zset 類型是一個既可以快速查找元素、又能按照分數排序的數據結構。為了實現這個特性,它使用了 兩種結構 來共同實現:

結構作用
哈希表(dict)用于通過成員名快速定位其分數,O(1) 時間復雜度
跳表(skiplist)用于按照分數進行有序排列,支持范圍查找、按排名查找等,平均 O(log n) 復雜度

🧠 為什么 Redis 用跳表而不是紅黑樹?

雖然紅黑樹、AVL 樹等自平衡二叉樹也能滿足排序要求,但 Redis 選擇跳表是因為:

  1. 實現簡單、易于維護
  2. 插入和刪除操作更平滑,少量隨機性避免最壞情況
  3. 天然支持范圍查詢和按 rank 查找
  4. 跳表是線性結構,遍歷更快,利于內存預取(cache friendly)

🧪 舉個例子:

127.0.0.1:6379> ZADD myzset 1 a 2 b 3 c
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"

在內部:

  • Redis 用 dict 維護 a → 1b → 2c → 3
  • 同時用跳表按分數 1 → 2 → 3 排列節點,方便范圍查詢,比如 ZRANGEBYSCORE

🔧 Redis 跳表結構核心代碼(在源碼中)

源碼路徑:/src/t_zset.c
關鍵結構:zskiplistzskiplistNode

typedef struct zskiplistNode {robj *obj;         // 成員對象double score;      // 分數struct zskiplistNode *backward;struct zskiplistLevel {struct zskiplistNode *forward;unsigned int span;} level[];
} zskiplistNode;

? 總結

Redis 中只有 zset 使用跳表,結合 hash dict 實現高效的查找和排序。

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

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

相關文章

2025深圳中興通訊安卓開發社招面經

2月27號 中興通訊一面 30多分鐘 自我介紹 聊項目 我的優缺點&#xff0c;跟同事相比&#xff0c;有什么突出的地方 Handler機制&#xff0c;如何判斷是哪個消息比較耗時 設計模式&#xff1a;模板模式 線程的狀態 線程的開啟方式 線程池原理 活動的啟動模式 Service和Activity…

【Castle-X機器人】二、智能導覽模塊安裝與調試

持續更新。。。。。。。。。。。。。。。 【Castle-X機器人】智能導覽模塊安裝與調試 二、智能導覽模塊安裝與調試2.1 智能導覽模塊安裝2.2 智能導覽模塊調試2.2.1 紅外測溫傳感器測試2.2.2 2D攝像頭測試 二、智能導覽模塊安裝與調試 2.1 智能導覽模塊安裝 使用相應工具將智能…

深入理解二叉樹遍歷:遞歸與棧的雙重視角

二叉樹的遍歷前序遍歷中序遍歷后續遍歷總結 二叉樹的遍歷 雖然用遞歸的方法遍歷二叉樹實現起來更簡單&#xff0c;但是要想深入理解二叉樹的遍歷&#xff0c;我們還必須要掌握用棧遍歷二叉樹&#xff0c;遞歸其實就是利用了系統棧去遍歷。特此記錄一下如何用雙重視角去看待二叉…

Qt Creator中自定義應用程序的可執行文件圖標

要在Qt Creator中為你的應用程序設置自定義可執行文件圖標&#xff0c;你需要按照以下步驟操作&#xff1a; Windows平臺設置方法 準備圖標文件&#xff1a; 創建一個.ico格式的圖標文件&#xff08;推薦使用256x256像素&#xff0c;包含多種尺寸&#xff09; 可以使用在線工…

Windows11系統中GIT下載

Windows11系統中GIT下載 0、GIT背景介紹0.0 GIT概述0.1 GIT誕生背景0.2 Linus Torvalds 的設計目標0.3 Git 的誕生&#xff08;2005 年&#xff09;0.4 Git 的后續發展0.5 為什么 Git 能成功&#xff1f; 1、資源下載地址1.1 官網資源1.2 站內資源 2、安裝指導3、驗證是否下載完…

react的fiber 用法

在 React 里&#xff0c;Fiber 是 React 16.x 及后續版本采用的協調算法&#xff0c;它把渲染工作分割成多個小任務&#xff0c;讓 React 可以在渲染過程中暫停、恢復和復用任務&#xff0c;以此提升渲染性能與響應能力。在實際開發中&#xff0c;你無需直接操作 Fiber 節點&am…

FPGA前瞻篇-數字電路基礎-邏輯門電路設計

模擬信號&#xff1a; 一條隨時間連續變化、平滑波動的曲線&#xff0c;比如正弦波。 數字信號&#xff1a; 一條只有高低兩個狀態&#xff08;0和1&#xff09;&#xff0c;跳變清晰的方波曲線。 在 IC 或 FPGA 的邏輯設計中&#xff0c;我們通常只能處理數字信號&#xff0…

RabbitMQ 基礎概念(隊列、交換機、路由鍵、綁定鍵、信道、連接、虛擬主機、多租戶)介紹

本文是博主在梳理 RabbitMQ 知識的過程中&#xff0c;將所遇到和可能會遇到的基礎知識記錄下來&#xff0c;用作梳理 RabbitMQ 的整體架構和功能的線索文章&#xff0c;通過查找對應的知識能夠快速的了解對應的知識而解決相應的問題。 文章目錄 一、RabbitMQ 是什么&#xff1f…

機器學習第一篇 線性回歸

數據集&#xff1a;公開的World Happiness Report | Kaggle中的happiness dataset2017. 目標&#xff1a;基于GDP值預測幸福指數。&#xff08;單特征預測&#xff09; 代碼&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科學計算的一個庫…

Java面試高頻問題(29-30)

二十九、全鏈路壓測&#xff1a;數據隔離與流量 關鍵技術點 1. 流量染色&#xff1a;通過Header注入X-Test-TraceId標識壓測流量 2. 影子庫表&#xff1a;通過ShardingSphere實現數據隔離 3. 熔斷降級&#xff1a;壓測流量觸發異常時自動切換回生產數據源 數據隔離方案對比 …

Python常用的第三方模塊之數據分析【pdfplumber庫、Numpy庫、Pandas庫、Matplotlib庫】

【pdfplumber庫】從PDF文件中讀取內容 import pdfplumber #打開PDF文件 with pdfplumber.open(DeepSeek從入門到精通(20250204).pdf) as pdf:for i in pdf.pages: #遍歷頁print(i.extract_text()) #extract_text()方法提取內容print(f----------------第{i.page_number}頁結束…

長短板理論——AI與思維模型【83】

一、定義 長短板理論思維模型&#xff0c;也被稱為木桶原理&#xff0c;是指一只木桶能盛多少水&#xff0c;并不取決于最長的那塊木板&#xff0c;而是取決于最短的那塊木板。該理論將木桶視為一個整體系統&#xff0c;各個木板代表著系統的不同組成部分或要素&#xff0c;強…

2025藍橋省賽c++B組第二場題解

前言 這場的題目非常的簡單啊&#xff0c;至于為什么有第二場&#xff0c;因為當時河北正在刮大風被迫停止了QwQ&#xff0c;個人感覺是歷年來最簡單的一場&#xff0c;如果有什么不足之處&#xff0c;還望補充。 試題 A: 密密擺放 【問題描述】 小藍有一個大箱子&#xff0…

【數據結構與算法】從完全二叉樹到堆再到優先隊列

完全二叉樹 CBT 設二叉樹的深度為 h , 若非最底層的其他各層的節點數都達到最大個數 , 最底層 h 的所有節點都連續集中在左側的二叉樹叫做 完全二叉樹 . 特點 對任意節點 , 其右分支下的葉子節點的最底層為 L , 則其左分支下的葉子節點的最低層一定是 L 或 L 1 .完全二叉樹…

Leetcode:1. 兩數之和

題目 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案&#xff0c;并且你不能使用兩次相同的元素。 你可以按任意順序返回答案。 示…

flume整合kafka

需求一&#xff1a; 啟動flume 啟動kafka消費者&#xff0c;驗證數據寫入成功 新增測試數據 需求二&#xff1a; 啟動Kafka生產者 啟動Flume 在生產者中寫入數據

Hbase集群管理與實踐

一、HBase集群搭建實戰 1.1 環境規劃建議 硬件配置基準(以10節點集群為例): 角色CPU內存磁盤網絡HMaster4核16GBSSD 200GB(系統盤)10GbpsRegionServer16核64GB124TB HDD(JBOD)25GbpsZooKeeper4核8GBSSD 500GB10Gbps1.2 關鍵配置項示例(hbase-site.xml) <configu…

STM32 開發 - stm32f10x.h 頭文件(內存映射、寄存器結構體與宏、寄存器位定義、實現點燈案例)

概述 STM32F10x.h 是 STM32F1 系列微控制器的核心頭文件&#xff0c;提供了所有外設寄存器的定義和內存映射 一、內存映射 #define PERIPH_BASE ((uint32_t)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE 0x…

QEMU源碼全解析 —— 塊設備虛擬化(23)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(22) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 特此致謝! QEMU啟動過程中的塊設備虛擬化 上一回解析了qcow2格式對應的qcow2_open函數,本回解…

【PCB工藝】推挽電路及交越失真

推挽電路(Push-Pull Circuit) 推挽電路(Push-Pull Circuit) 是一種常用于功率放大、電機驅動、音頻放大等場合的電路結構,具有輸出對稱、效率高、失真小等優點。 什么是推挽電路? 推挽是指:由兩種極性相反的器件(如 NPN 和 PNP、NMOS 和 PMOS)交替導通,一個“推”電…