Redis設計與實現 四 跳躍表

2022-07-10 22:33:07 字數 1342 閱讀 7981

跳躍表是乙個有序的資料結構,跳躍是通過在當前節點儲存多個其他節點的指標,來達到跳躍的目的。它支援平均o(logn)、最差o(n)複雜度的節點查詢,還可以通過順序性來批量處理節點。在大部分情況下,跳躍表的效率和平衡樹是一樣的,但是邏輯上比平衡樹更加簡單。

redis通過跳躍表實現有序集合鍵的底層實現之一。在跳躍表中只有兩個地方使用到了跳躍表,乙個是有序集合鍵,另外乙個則是在集群情況下作為內部資料結構。

redis內部的跳躍表是由zskiplistnode和zskiplist這兩個組成的。zskiplistnode表示跳躍的節點,zskiplist結構則表示用於儲存跳躍表節點的相關資訊,比如節點的數量,以及指向表頭節點和表尾節點的指標等等。

zskiplist儲存了頭節點和尾節點,以及目前節點中層數最大的值,以及節點的個數。zskiplistnode則儲存了層(包含了前進指標以及跨度)和後退指標。上面中箭頭表示了前進指標,上面的數字表示了跨度。

層:level陣列可以包含多個元素,每個元素都有乙個指向其他節點的指標。程式可以通過這些層,來加快訪問其他節點的速度,每次新建乙個節點的都會隨機生成乙個1-32之間的值來作為level的陣列大小,這個大小則是陣列的高度。

前進指標:每一層都有乙個指向表尾方向的前進指標,用於從表頭向表尾方向訪問節點。

跨度:跨度用來記錄兩個節點之間的距離。這邊注意的一點是跨度和遍歷無關,遍歷只需要知道下乙個節點的位置就行了,跨度是用來計算節點的mark的,例如你知道你要找的是哪乙個,打個比分是sroce是3的,那麼有可能就可以直接獲得,如果是找2的,那麼從l2開始進行就可以很快的找到。

節點的score是乙個double型別的資料,節點的成員物件則是sds,在同乙個跳躍表裡面各個節點儲存的成員物件需要是一致的。但是多個節點儲存的分值卻可以相同;分值相同的節點可以按照成員物件在字典中的大小來進行排序。說白了 跳躍表就是通過維護有序,按照sroce來實現快速定位。

Redis設計與實現之跳躍表

一 定義 跳躍表 skiplist 是一種有序的資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的 跳躍表支援平均o logn 最壞o n 複雜度的節點查詢,還可以通過順序性操作來批量處理節點。redis使用跳躍表作為有序集合鍵的底層實現之一,若乙個有序集合包含的元素...

四 跳躍表(Redis)

跳躍表 skiplist 是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的 指標,從而達到快速訪問節點的目的。redis 的跳躍表由 redis.h zskiplistnode 和 redis.h zskiplist 兩個結構定 義,其中zskiplistnode結構用於表示跳躍表節點,...

《Redis設計與實現》第五章 跳躍表

跳表是一種有序的資料結構,它通過在每個節中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。跳躍表支援平均 logn 最壞o n 時間複雜度的查詢。跳躍表作為有序集合鍵的底層實現之一。redis兩個地方用到了跳躍表 乙個是實現有序集合鍵 另外乙個是在集群節點中用作內部資料結構,除此之外沒有其他...