Redis基本資料結構 跳躍表實現

2021-07-10 23:12:39 字數 946 閱讀 8436

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

跳躍表支援平均o(

log)

、最壞o(

n)複雜度的節點查詢. 大部分情況下,跳躍表的效率可以和平衡樹想媲美,並且跳躍表的實現比平衡樹更為簡單.

redis 使用跳躍表作為有序集合鍵的底層實現之一, 如果乙個有序集合包含的元素數量較多,或者有序集合中元素的成員是比較長的字串, redis 會使用跳躍表來作為有序集合的底層實現.

和鍊錶、字典等資料結構被廣泛應用在 redis 中不同, redis 只在兩個地方用到了跳躍表,乙個是實現有序集合鍵,另乙個是在集群節點中用作內部資料結構, 除此之外,跳躍表在 redis 中沒有其他用途.

redis 的跳躍表是有redis.h/zskiplistnoderedis.h/zskiplist兩個結構定義

typedef

struct zskiplistnode level;

} zskiplistnode;

結構體各成員說明如下:

下圖顯示乙個簡單的跳躍表布局:

圖的左邊為zskiplist結構,用來管理跳躍表節點.

zskiplist結構定義如下:

typedef

struct zskiplist zskiplist;

表頭節點並沒有算到 節點數量裡面,表頭節點和其他節點的構造是一樣的:有前進指標、後退指標、分值和成員物件,不過這些屬性都不會用到,所以圖中省略這些部分,只顯示表頭節點的各層.

根據跳躍表的結構,程式可以在o(

1)複雜度內返回表的長度,o(

1)複雜度內定位表頭節點和表尾節點.

redis資料結構 跳躍表

跳躍表 skiplist 是一種有序資料鏈表結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。查詢平均效能為o logn 最壞的情況會出現o n 情況,而redis中的zset在資料較多的時候底層就是採用跳躍表去實現的,元素較少的時候會進行小物件壓縮採用壓縮列表實現。小...

Redis資料結構 跳躍表

跳躍表是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。redis使用跳躍表作為有序集合鍵的底層實現之一,如果乙個有序集合包含的元素數量比較多,又或者有序集合中的元素的成員是比較長的字串時,redis就會使用跳躍表作為有序集合鍵的底層實現。redis的跳躍...

Redis資料結構 skiplist(跳躍表)

跳躍表在redis中主要用於有序集合鍵的實現,其他地方沒怎麼用到,但是這種資料結構在面試的時候經常會問到,因為它作為一種查詢時間複雜度為o logn 的特殊的鍊錶,效率堪比紅黑樹或平衡樹,而實現難度卻遠小於它們。下面分3個模組講解redis的跳躍表實現 一 跳躍表的應用場景 在redis中,當有序集...