Redis學習 4 跳躍表(skiplist)

2021-09-14 07:17:09 字數 1971 閱讀 6892

跳躍表(skiplist)是一種有序的資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。它的效率可以媲美平衡樹,跳躍表的平均複雜度o(logn)最壞情況複雜度o(n),並且其原理和**都要比平衡樹更加簡單,因此很多地方多用跳躍表代替平衡樹。

1,redis使用跳躍表作為有序集合鍵的底層實現的資料結構之一。

1)當有序集合元素成員時較長的字串時。

2)當有序集合包含元素很多時。

2,同時redis也使用跳躍表在集群節點中用作內部資料結構。

(redis只在這兩個地方使用了跳躍表)

(一),redis的跳躍表由redis.h/zskiplistnode(跳躍表節點)和redis.h/zskiplist(跳躍表)兩個結構定義。

乙個跳躍表圖例:(最左邊含有header和tail指標的是跳躍表,左邊四個是跳躍表節點)

(二)跳躍表節點的源**和各個屬性簡介

typedef struct zskiplistnode level;

//後退指標

struct zskiplistnode *backforward;

//分值

double score;

//成員物件

robj *obj;

}zskiplistnode;

1,層(level),前進指標(層指標,level[i].forward),跨度(level[i].span)

這裡的跳躍表節點的層陣列是乙個柔性陣列,可以包含多個元素,每個元素都包含乙個層指標(level[i].forward),指向該結點在本層的後繼結點。該指標用於從表頭向表尾方向訪問結點,它可以一次跳過自身節點後的多個節點。可以通過這些層指標來加快訪問結點的速度。這裡,redis中的跳躍表和其他一般跳躍表不同的地方在於使用了跨度(level[i].span),而跨度記錄了前進指標level[i].forward所指向的節點和當前節點的距離。通過跳躍表結點的層跨度,可以快速得到該結點在跳躍表中的排名。

層陣列的大小遵循冪次定律(power law,越大的數出現的機率越小)隨機生成乙個介於1和32之間的值作為層陣列大小。

2,後退指標(backward)

redis跳躍表區別於普通跳躍表還有個後退指標(zskiplistnode.backward),用於從表尾向表頭方向訪問節點。並且每個後退指標只指向自身節點的前乙個節點,構成了乙個鍊錶。

3,分值(score)和成員物件(obj)

分值(score)屬性是乙個double型別的浮點數,跳躍表中的所有節點都按分值的大小排序。不同的節點可以有相同的分值,相同的分值會按照成員物件在字典序中的大小來排序。

成員物件(obj)是乙個指標,它指向乙個字串物件,而字串物件又儲存了乙個sds值。不同的節點的成員物件是必須是不同的,即成員物件是唯一的。

(三)跳躍表的源**和各個屬性簡介

跳躍表由多個跳躍節點組成。由zskiplist結構來組織這些節點,儲存它們的一些資訊,如:節點長度、節點數量。

typedef struct zskiplistzskiplist;
1,頭指標(header)和尾指標(tail)

頭指標(header)和尾指標(tail)分別指向跳躍表的表頭結點和尾節點。通過這兩個指標,定位表頭結點和表尾結點的複雜度為o(1)。表尾結點是表中最後乙個結點。而表頭結點實際上是乙個偽結點,該結點的成員物件為null,分值為0,它的層數固定為32(層的最大值)。

2,表中節點數量(length)

用來記錄節點數量,使得獲取表的節點數量的複雜度尾o(1)。

3,表中層數的最大值(level)

用於記錄層數最大的節點的層數,使得獲取層數最大的那個節點的層數量複雜度為o(1)(表頭節點不計入,因為它的層數固定為32(層的最大值)。)

redis中跳躍表的一些具體操作的源**實現推薦博文:

Redis 學習 5 跳躍表

和鍊錶 字典等資料結構被廣泛地應用在redis內部不同,redis只在倆個地方用到了跳躍表,乙個是實現有序集合鍵,另乙個是在集群結點中用作內部資料結構,除此之外,跳躍表在redis裡面沒有其他用途。跳躍表 skiplist 是一種有序資料結構,他通過在每個結點中維持多個指向其他節點的指標,從而達到快...

Redis學習筆記(四) 跳躍表

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

Redis的跳躍表

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