redis資料結構——跳躍表
阿新 • • 發佈:2019-02-16
跳躍表是一種有序的資料結構,它的平均時間複雜度是O(logN),它通過在一個節點中維護多個指向其他節點的指標,達到快速查詢和訪問其他節點的目的。在redis中跳躍表只用在實現sorted set和叢集節點中。
下面來看看跳躍表的結構
typedef struct zskiplist {
/* 節點指標,分別指向頭節點和尾節點 */
struct zskiplistNode *header, *tail;
/* 長度 */
unsigned long length;
/* 等級 */
int level;
} zskiplist;
其中節點的結構如下
typedef struct zskiplistNode { /* sds型別的元素 */ sds ele; /* 分數 */ double score; /* 後退指標 */ struct zskiplistNode *backward; /* 層級 */ struct zskiplistLevel { /* 前進指標 */ struct zskiplistNode *forward; /* 跨度 */ unsigned int span; } level[]; } zskiplistNode;
結構圖來自《redis設計與實現》一書
看圖來說說結構中的屬性:(從左到右我們把節點編號為1、2、3、4)
跳躍表結構:
header:指向頭節點1
tail:指向尾節點4
level:除開表頭節點,剩餘所有的節點中層級數最大的那個節點的層級,也就是節點4的層級,=5
length:除開表頭節點的剩餘所有節點的個數,=3
節點結構:
ele:元素。圖中的o1、o2、o3
score:分數。圖中的1.0、2.0、3.0,用於計算節點在跳躍表中的排位,計算方法是:將查詢次節點過程中經過的所有層的span相加。如果查詢節點4,從節點1開始。路徑為:節點1的L5 -> 節點4的L5,span=3,那麼節點4的排位=3
backforward :後退指標。圖中的BW。用於從表尾開始遍歷到表頭。
zkiplistlevel 結構:前進指標。比如節點1的L5指向節點4的L5;span:跨度。比如節點1的L5到節點4的L5的跨度=3