四 跳躍表(Redis)

2021-10-06 19:53:09 字數 1476 閱讀 2911

跳躍表(skiplist)是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的 指標,從而達到快速訪問節點的目的。

redis 的跳躍表由 redis. h/zskiplistnode 和 redis. h/zskiplist 兩個結構定 義,其中zskiplistnode結構用於表示跳躍表節點,而zskiplist結構則用於儲存跳 躍表節點的相關資訊,比如節點的數量,以及指向表頭節點和表尾節點的指標等等。

層(level):節點中用ll、l2、l3等字樣標記節點的各個層,l1代表第一層,l2 代表第二層,以此類推。每個層都帶有兩個屬性:前進指標和跨度。前進指標用於 訪問位於表尾方向的其他節點,而跨度則記錄了前進指標所指向節點和當前節點的 距離。在上面的中,連線上帶有數字的箭頭就代表前進指標,而那個數字就是跨度。當程式從表頭向表尾進行遍歷時,訪問會沿著層的前進指標進行。

後退(backward)指標:節點中用bw字樣標記節點的後退指標,它指向位於當前節 點的前乙個節點。後退指標在程式從表尾向表頭遍歷時使用。

分值(score ):各個節點中的1.0、2.0和3.0是節點所儲存的分值。在跳躍表中, 節點按各自所儲存的分值從小到大排列。

成員物件(obj ):各個節點中的〇1、〇2和〇3是節點所儲存的成員物件。是乙個指標,它指向乙個字串物件;字串物件則保 存著乙個sds值。分值相同的節點將按照成員物件在字典序中的大小來進行排序。

header:指向跳躍表的表頭節點

tail:指向跳躍表的表尾節點

level:層數最大的那個節點的層數

length:記錄跳躍表的長度(節點的數量)

跳躍表是有序集合的底層實現之一

每個跳躍表節點的層高都是1至32之間的隨機數

在同乙個跳躍表中,多個節點可以包含相同的分值,但每個節點的成員物件必須是唯一的

跳躍表中的節點按照分值大小進行排序,當分值相同時,節點按照成員物件的大小 進行排序

Redis學習筆記(四) 跳躍表

跳躍表是一種以o log n 期望時間支援查詢 插入 刪除操作的 有序的資料結構。redis使用跳躍表作為有序集合鍵的底層實現之一。跳表的基本實現原理參考 skip lists a probabilistic alternative to balanced trees redis的跳表由zskipl...

Redis設計與實現 四 跳躍表

跳躍表是乙個有序的資料結構,跳躍是通過在當前節點儲存多個其他節點的指標,來達到跳躍的目的。它支援平均o logn 最差o n 複雜度的節點查詢,還可以通過順序性來批量處理節點。在大部分情況下,跳躍表的效率和平衡樹是一樣的,但是邏輯上比平衡樹更加簡單。redis通過跳躍表實現有序集合鍵的底層實現之一。...

Redis的跳躍表

typedef struct zskiplistnode level 層 層高1 32隨機,一般層數量越多,訪問其他節點速度越快 struct zskiplistnode backward 後退指標 只能退至前乙個節點 double score 分值 所有節點按分值從小到大排序 robj obj 成...