Redis數據結構:深入解析跳躍表(Skiplist)

???感謝您閱讀本文,歡迎“一鍵三連”。作者定會不負眾望,按時按量創作出更優質的內容。
?? 1. 畢業設計專欄,畢業季咱們不慌,上千款畢業設計等你來選。

引言

Redis是一款廣泛使用的內存數據結構存儲系統,支持多種數據結構,如字符串、哈希、列表、集合和有序集合等。跳躍表(Skiplist)作為Redis中實現有序集合的核心數據結構,憑借其高效的插入、刪除和查找性能,在數據存儲和檢索中扮演著重要角色。本文將詳細介紹跳躍表的原理、特點、應用場景、Java實現代碼以及在Redis中的使用方法。

跳躍表的原理

跳躍表是一種基于鏈表的分層數據結構,通過在不同層次間建立跳躍連接,實現對元素的快速查找。跳躍表的每一層都是一個有序鏈表,且上層鏈表是下層鏈表的子集,最底層鏈表包含所有元素。

跳躍表的查找過程類似于二分查找,通過逐層向下查找,跳躍越過大量元素,從而實現對數級別的查找效率。插入和刪除操作也通過更新相關層次的鏈接,實現高效操作。

跳躍表的特點

  1. 時間復雜度:跳躍表的平均時間復雜度為O(log n),最壞情況下為O(n)。
  2. 空間復雜度:跳躍表的空間復雜度為O(n log n)。
  3. 實現簡單:相對于平衡樹,跳躍表的實現更為簡單。
  4. 動態性好:跳躍表能夠動態調整結構,適應數據的插入和刪除。

跳躍表的應用場景

跳躍表在Redis中的主要應用場景包括:

  1. 有序集合(Sorted Set):通過跳躍表實現有序集合的數據存儲,支持快速的范圍查找和排名操作。
  2. Leaderboard:實現排行榜功能,快速插入、刪除和查找用戶排名。
  3. 時間序列數據:存儲和檢索時間序列數據,支持高效的范圍查詢。

Java實現跳躍表

下面是跳躍表的Java實現代碼及其測試方法:

import java.util.Random;// 跳躍表節點類
class SkipListNode {int value;SkipListNode[] forward;public SkipListNode(int level, int value) {this.value = value;this.forward = new SkipListNode[level + 1];}
}// 跳躍表類
class SkipList {private static final int MAX_LEVEL = 16; // 最大層數private SkipListNode head; // 頭節點private int level; // 當前最大層數private Random random;public SkipList() {this.head = new SkipListNode(MAX_LEVEL, Integer.MIN_VALUE);this.level = 0;this.random = new Random();}// 插入元素public void insert(int value) {SkipListNode[] update = new SkipListNode[MAX_LEVEL + 1];SkipListNode x = head;for (int i = level; i >= 0; i--) {while (x.forward[i] != null && x.forward[i].value < value) {x = x.forward[i];}update[i] = x;}x = new SkipListNode(randomLevel(), value);for (int i = 0; i <= x.forward.length - 1; i++) {x.forward[i] = update[i].forward[i];update[i].forward[i] = x;}if (x.forward.length - 1 > level) {level = x.forward.length - 1;}}// 查找元素public boolean search(int value) {SkipListNode x = head;for (int i = level; i >= 0; i--) {while (x.forward[i] != null && x.forward[i].value < value) {x = x.forward[i];}}x = x.forward[0];return x != null && x.value == value;}// 刪除元素public void delete(int value) {SkipListNode[] update = new SkipListNode[MAX_LEVEL + 1];SkipListNode x = head;for (int i = level; i >= 0; i--) {while (x.forward[i] != null && x.forward[i].value < value) {x = x.forward[i];}update[i] = x;}x = x.forward[0];if (x != null && x.value == value) {for (int i = 0; i <= x.forward.length - 1; i++) {update[i].forward[i] = x.forward[i];}while (level > 0 && head.forward[level] == null) {level--;}}}// 隨機生成層數private int randomLevel() {int level = 0;while (random.nextDouble() < 0.5 && level < MAX_LEVEL) {level++;}return level;}// 打印跳躍表public void printSkipList() {for (int i = level; i >= 0; i--) {SkipListNode x = head.forward[i];while (x != null) {System.out.print(x.value + " ");x = x.forward[i];}System.out.println();}}// 測試跳躍表public static void main(String[] args) {SkipList skipList = new SkipList();skipList.insert(1);skipList.insert(2);skipList.insert(3);skipList.insert(4);skipList.insert(5);System.out.println("Skip List after inserts:");skipList.printSkipList();System.out.println("Search 3: " + skipList.search(3));System.out.println("Search 6: " + skipList.search(6));skipList.delete(3);System.out.println("Skip List after deleting 3:");skipList.printSkipList();}
}

Redis中跳躍表的使用

在Redis中,跳躍表主要用于實現有序集合(Sorted Set)。下面是一些基本的有序集合命令及其使用示例:

添加元素
# 將一個帶有分數的元素添加到有序集合中
zadd myzset 1 "one"
zadd myzset 2 "two"
zadd myzset 3 "three"
獲取元素
# 按照分數從低到高獲取所有元素
zrange myzset 0 -1# 按照分數從高到低獲取所有元素
zrevrange myzset 0 -1
刪除元素
# 刪除指定元素
zrem myzset "two"
獲取元素的排名
# 獲取元素的排名(從0開始)
zrank myzset "three"
獲取元素的分數
# 獲取元素的分數
zscore myzset "one"

總結

跳躍表作為Redis實現有序集合的核心數據結構,具備高效的查找、插入和刪除性能,適用于多種應用場景。通過本文對跳躍表原理、特點、應用場景的詳細介紹,以及Java實現代碼和Redis使用方法的展示,希望讀者能夠深入理解跳躍表這一重要數據結構,并在實際應用中靈活運用。

???感謝您閱讀本文,歡迎“一鍵三連”。作者定會不負眾望,按時按量創作出更優質的內容。
?? 1. 畢業設計專欄,畢業季咱們不慌,上千款畢業設計等你來選。

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

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

相關文章

Java醫院績效考核系統源碼 :3分鐘帶你了解(醫院績效考核系統有哪些應用場景)三級公立醫院績效考核系統源碼

Java醫院績效考核系統源碼 &#xff1a;3分鐘帶你了解&#xff08;醫院績效考核系統有哪些應用場景&#xff09;三級公立醫院績效考核系統源碼 作為醫院用綜合績效核算系統&#xff0c;系統需要和his系統進行對接&#xff0c;按照設定周期&#xff0c;從his系統獲取醫院科室和…

可持續性是 Elastic: 進步與新機遇的一年

作者&#xff1a;來自 Elastic Keith Littlejohns 我們最新的可持續發展報告&#xff08;Sustainability Report&#xff09;總結了 Elastic 又一個令人興奮的進步年&#xff0c;我們的項目繼續揭示新的機遇。過去的一年對于我們與主要利益相關者群體合作以更好地了解他們的目標…

[解決方案]使用微軟拼音打中文卡頓到離譜

去這里看&#xff0c;發現有65535個文件&#xff0c;基本都是臨時文件。刪除后測試了一下&#xff0c;不會卡頓了但是只要打中文還是會瘋狂生成tmp臨時文件。 問題&#xff1a;輸入法不兼容 解決方案 先把上面那個文件夾里的tmp文件全刪了 直接點是&#xff0c;其他的文件會…

【ajax實戰02】數據管理網站—驗證碼登錄

一&#xff1a;數據提交&#xff08;提交手機驗證碼&#xff09; 核心思路整理 利用form-serialize插件&#xff0c;收集對象形式的表單數據后&#xff0c;一并提交給服務器。后得到返回值&#xff0c;進一步操作 基地址&#xff1a; axios.defaults.baseURL http://geek.…

制作一個智能體:抖音熱點話題文案制作助手

文章目錄 第一步&#xff0c;添加助手第二步&#xff0c;選擇語聚GPT第三步&#xff0c;填寫相關信息第四步&#xff0c;工具中選擇抖音(普通號)第五步&#xff0c;選擇“查詢熱門視頻數據”第六步&#xff0c;測試總結 這篇文章&#xff0c;我們手把手的演示開發一個智能體&am…

Dxf庫中的DL_Codes類

在 DXF 文件格式中&#xff0c;DL_Codes 通常是一個用于表示不同類型數據的枚舉類或常量集合。這些代碼用于標識 DXF 文件中各種數據元素的類型&#xff0c;例如實體類型、屬性類型、顏色值等。通過使用 DL_Codes&#xff0c;您可以更輕松地解析和處理 DXF 文件中的數據。 以下…

leetcode119 楊輝三角②

給定一個非負索引 rowIndex&#xff0c;返回「楊輝三角」的第 rowIndex 行。 在「楊輝三角」中&#xff0c;每個數是它左上方和右上方的數的和。 示例 1: 輸入: rowIndex 3 輸出: [1,3,3,1]示例 2: 輸入: rowIndex 0 輸出: [1]示例 3: 輸入: rowIndex 1 輸出: [1,1] pub…

寵物空氣凈化器熱賣爆款,希喂、小米、352貓用空氣凈化器真實PK

相信大漫天多數養貓家庭都會有一個煩惱&#xff1a;貓咪們的貓實在是太多了&#xff0c;無法忍受家里面漫天飛舞的浮毛和難聞的貓貓便臭。作為養貓多年的過來人我嘗試過很多種方法清理這些貓浮毛和異味&#xff0c;但都以失敗告終。 直到后面看到一個寵物博主推薦的寵物空氣凈…

ffmpeg截取視頻

用格式工廠截取視頻不知道為啥還是原長度&#xff0c;不過只能播放截取的部分&#xff0c;其他部分不能播放&#xff0c;但是總時長不對就不想用了。 參考 https://blog.csdn.net/m0_60259116/article/details/127017324https://cloud.tencent.com/developer/article/2410818ht…

tensorrt動態batch推理注意事項

一、背景&#xff1a;使用pytorch進行訓練得到pt模型&#xff0c; 然后使用torch.onnx把pt模型轉化為onnx模型。然后再使用tensorrt自帶的trtexec.exe文件把onnx模型轉化為engine文件。 &#xff08;1&#xff09;在使用C進行推理的時候發現一個batch的數據&#xff0c;值推理…

篩斗數據:數據提取技術,讓數據說話的力量

在當今這個信息爆炸的時代&#xff0c;數據已經滲透到我們生活的方方面面。從商業決策到科學研究&#xff0c;從社會治理到個人生活&#xff0c;數據都扮演著至關重要的角色。而要讓這些數據真正發揮其價值&#xff0c;就需要依賴數據提取技術&#xff0c;讓數據“開口說話”&a…

環路濾波器

塊效應產生的原因 塊效應指視頻邊界不連續的變化,我們在觀看視頻的時候,在運動劇烈的場景常能觀察到圖像出現小方塊,小方塊在邊界處呈現不連續的效果(如下圖),這種現象被稱為塊效應(blocking artifact)。 造成這種現象的主要原因有兩點: DCT量化誤差導致運動補償導致…

深入理解Java多線程中的 wait() 和 notify():為何要與 synchronized 手牽手

在Java中&#xff0c;wait、notify方法通常與synchronized關鍵字一起使用&#xff0c;這樣做有幾個重要的原因&#xff0c;主要涉及線程的協調和正確的并發控制。以下是一些關鍵點&#xff1a; 監視器鎖&#xff08;Monitor Lock&#xff09;&#xff1a; 每個對象在Java中都可…

二叉樹 遍歷迭代法

二叉樹 遍歷迭代法 Leetcode 94 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), rig…

一個產品需求工程師繁忙的一天

早晨&#xff1a;開啟新的一天 7:00 AM - 起床 早晨七點準時起床。洗漱、早餐后&#xff0c;查看手機上的郵件和消息&#xff0c;提前了解今天的工作安排和優先事項。 8:00 AM - 前往公司 坐地鐵前往公司。在地鐵上&#xff0c;習慣性地閱讀一些行業資訊和市場報告&#xff0…

使用SpringBoot整合Servlet

一、SpringBoot和Servlet的整合 1、用注解WebServlet配置Servlet映射 創建一個SpringBoot的web工程&#xff0c;在工程用創建一個Servlet 2、在SpringBoot的啟動類上加注解ServletComponentScan 二、額外的方式 1、不使用WebServlet配置Servlet映射 創建一個SpringBoot工…

RabbitMQ延時隊列(實現定時任務)

消息的TTL(Time To Live)就是消息的存活時間。 RabbitMQ可以對隊列和消息分別設置TTL。 對隊列設置存活時間&#xff0c;就是隊列沒有消費者連著的保留時間。 對每一個單獨的消息單獨的設置存活時間。超過了這個時間&#xff0c;我們認為這個消息就死了&#xff0c;稱之為死…

代碼隨想錄算法訓練營:19/60

非科班學習算法day19 | LeetCode530:二叉搜索樹的最小絕對差 &#xff0c;Leetcode501:二叉搜索樹的眾數 &#xff0c;Leetcode236:二叉樹的最近公共祖先 目錄 介紹 一、LeetCode題目 1.LeetCode530:二叉搜索樹的最小絕對差 題目解析 2.Leetcode501: 二叉搜索樹的眾數 …

軟設之加工邏輯之結構化語言

結構化語言是一種介于自然語言和形式化語言之間的半形式語言&#xff0c;是自然語言的一個受限子集 外層&#xff1a;用來描述控制結構&#xff0c;采用順序&#xff0c;選擇和重復3種基本結構 1.順序結構&#xff1a;一組祈使語句&#xff0c;選擇語句&#xff0c;重復語句的…

個人對JVM的一點理解

JVM&#xff08;Java 虛擬機&#xff09;是 Java 程序能夠跨平臺運行的關鍵。它負責將 Java 字節碼轉換為機器碼并執行。 JVM 主要由類加載器、運行時數據區、執行引擎和本地方法接口等部分組成。運行時數據區包括方法區、堆、虛擬機棧、本地方法棧和程序計數器等。 GC&#xf…