redis 資料結構 跳表

2021-08-16 01:26:35 字數 937 閱讀 5403

要先有跳表的資料結構基礎:

跳表是鍊錶的乙個變種,通過增加多餘的指標,將單向鍊錶變成多向鍊錶,進而使跳表的查詢效率和平衡二叉樹看齊(平均o(logn),最壞o(n)),而且較之二叉樹實現方便。

而跳表本身,有一些比較迷的實現策略:比如,新增節點的層次是通過隨機數(拋硬幣)指定的,存在乙個隨機概率,這在redis內,概率為1/4,同時規定,層數最大為32

/**

* 跳表節點

**/typedef

struct zskiplistnode level;

struct zskiplistnode *backward;//指向前乙個節點的指標

double score;

robj * obj;//儲存的redis物件

}

redis內的跳表存在乙個zskiplist的結構體,內部儲存乙個跳表的頭、尾、節點個數和當前層數

redis的跳表,第乙個節點是不儲存資料的,而只起到連線各個層的作用

層序號是,1層表示包含所有節點的層,之後越大的層包含節點越少

zskiplistlevel內包含兩個屬性,其中span屬性表示通過 forward指標,跨過了底層的幾個節點連線到當前層的下乙個節點,在有序集合中,節點的rank,就是通過累加span來計算出來的和leve內的forward指標在乙個node裡可以有多個不同,乙個node內只有乙個backward指標,表示在最底層,指向上乙個節點的指標

對於score,跳表是按照score的公升序排列,如果分數一樣,按照obj物件的字典序排序(字典序是:1 < 11 < 111 < 2 < 221 < 23,和js預設對數字的排序方式一樣)

robj *obj是乙個指向字串物件的指標,字串物件內包含乙個sds,字典序就是這個sds的字典序

有序集合的實現之一,適用範圍不廣

Redis的底層資料結構 跳表

跳躍表 skiplist 是一種有序資料結構,它通過在每個節點中維持多個指向其它節點的指標,從而達到快速訪問節點的目的。具有如下性質 1 由很多層結構組成 2 每一層都是乙個有序的鍊錶,排列順序為由高層到底層,都至少包含兩個鍊錶節點,分別是前面的head節點和後面的nil節點 3 最底層的鍊錶包含了...

資料結構之跳表

字典有一些形如 字典的節點 鍊錶節點定義 template struct pairnode pairnode const pair element element element pairnode const pair element,pairnode next element element 字典...

資料結構 跳表改造

儲存鍵值對id value值 儲存100萬資料對 查詢value區間,比如10到100 個數?查詢id區間,比如10到100 個數?查詢某id或某value,排名第幾?在跳表實體加個索引號 skiplist skiplist new skiplist skiplist.put 5,5 skiplis...