1. 程式人生 > >redis資料結構——跳躍表

redis資料結構——跳躍表

跳躍表是一種有序的資料結構,它的平均時間複雜度是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