redis原始碼學習 skiplist

2022-08-17 09:21:21 字數 823 閱讀 9115

圖中所示,跳躍表與普通鍊錶的區別在於,每乙個節點可以有多個後置節點,圖中是乙個4層的跳躍表

第0層: head->3->6->7->9->12->17->19->21->25->26->tail

第1層: head->6->9->17->25->tail

第2層: head->6->25->tail

第3層: head->6->tail

傳統意義的單鏈表是乙個線性結構,向有序的鍊錶中插入乙個節點需要o(n)的時間,查詢操作需要o(n)的時間。如果我們使用圖中所示的跳躍表,就可以減少查詢所需時間為o(n/2),因為我們可以先通過每個節點的最上面的指標先進行查詢,這樣子就能跳過一半的節點。比如我們想查詢19,首先和6比較,大於6之後,在和9進行比較,然後在和12進行比較......最後比較到21的時候,發現21大於19,說明查詢的點在17和21之間,從這個過程中,我們可以看出,查詢的時候跳過了3、7、12等點,因此查詢的複雜度為o(n/2)。

redis實現的跳躍表特點:

1.zskiplistnode中儲存著前置節點backward

2.跳躍表的層數最大值32,每次插入新節點都會生成乙個隨機的level(1~32)作為新節點的層數

3.刪除節點可能會引起跳躍表層數的下降,插入節點可能會引起跳躍表層數上公升

4.查詢節點的時間複雜度平均為 o(logn)

5.插入和刪除的成本都比較低,擁有平衡二叉樹的查詢效能

redis原始碼學習筆記

目錄 1 從資料結構開始 圖為原始碼,附帶個人簡單分析 a 動態字串 檔案 sds.h sds.c 前言 s sizeof struct sdshdr 的解釋為buf為柔性陣列,不占用空間,僅僅為偏移量,所以s指標向後退乙個結構體大小為結構體位址所在。分析 這個結構是整個動態字串的基礎,sds為 s...

Redis 原始碼學習之 Redis 事務Nosql

redis事務提供了一種將多個命令請求打包,然後一次性 按照順序地執行多個命令的機制,並且在事務執行的期間,伺服器不會中斷事務而去執行其他不在事務中的命令請求,它會把事務中所有的命令都執行完畢才會去執行其他的命令。howredis中提供了multi discard exec watch unwatc...

Redis原始碼學習之 Tcp Socket封裝

anet.h anet.c 主要包含以下幾個封裝函式 這裡僅介紹關於tcp socket的封裝函式 anettcpconnect 建立socket並呼叫底層的connect進行連線。anettcpnonblockconnect 和anettcpconnect功能類似,但是設定連線的socket為非阻...