跳躍表( skiplist) 是一種有序的資料結構, 它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的.
跳躍表支援平均o(
log)
、最壞o(
n)複雜度的節點查詢. 大部分情況下,跳躍表的效率可以和平衡樹想媲美,並且跳躍表的實現比平衡樹更為簡單.
redis 使用跳躍表作為有序集合鍵的底層實現之一, 如果乙個有序集合包含的元素數量較多,或者有序集合中元素的成員是比較長的字串, redis 會使用跳躍表來作為有序集合的底層實現.
和鍊錶、字典等資料結構被廣泛應用在 redis 中不同, redis 只在兩個地方用到了跳躍表,乙個是實現有序集合鍵,另乙個是在集群節點中用作內部資料結構, 除此之外,跳躍表在 redis 中沒有其他用途.
redis 的跳躍表是有redis.h/zskiplistnode
和redis.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中,當有序集...