redis 基礎-數(shù)據(jù)結(jié)構-跳躍表

跳躍表定義:

跳躍表(skiplist)是一種有序數(shù)據(jù)結(jié)構,它通過在每個節(jié)點中維持多個指向其他節(jié)點的指針唧躲,從而達到快速訪問節(jié)點的目的嗡善。

跳躍表支持平均O(logN)、最壞O(N)復雜度的節(jié)點查找术吝,還可以通過順序性操作來批量處理節(jié)點计济。

跳躍表使用場景:

Redis使用跳躍表作為有序集合鍵的底層實現(xiàn)之一,如果一個有序集合包含的元素數(shù)量比較多排苍,又或者有序集合中元素的成員(member)是比較長的字符串時沦寂,Redis就會使用跳躍表來作為有序集合鍵的底層實現(xiàn),
和鏈表、字典等數(shù)據(jù)結(jié)構被廣泛地應用在Redis內(nèi)部不同淘衙,Redis只在兩個地方用到了跳躍表传藏,一個是實現(xiàn)有序集合鍵,另一個是在集群節(jié)點中用作內(nèi)部數(shù)據(jù)結(jié)構彤守,除此之外毯侦,跳躍表在Redis里面沒有其他用途。

跳躍表構成:

Redis的跳躍表由redis.h/zskiplistNode和redis.h/zskiplist兩個結(jié)構定義具垫。

zskiplistNode結(jié)構用于表示跳躍表節(jié)點:

  • 層(level):節(jié)點中用L1侈离、L2、L3等字樣標記節(jié)點的各個層做修,L1代表第一層霍狰,L2代表第二層抡草,以此類推。

每個層都帶有兩個屬性:前進指針和跨度蔗坯。前進指針用于訪問位于表尾方向的其他節(jié)點康震,而跨度則記錄了前進指針所指向節(jié)點和當前節(jié)點的距離。在上面的圖片中宾濒,連線上帶有數(shù)字的箭頭就代表前進指針腿短,而那個數(shù)字就是跨度。當程序從表頭向表尾進行遍歷時绘梦,訪問會沿著層的前進指針進行橘忱。

  • 后退(backward)指針:節(jié)點中用BW字樣標記節(jié)點的后退指針,它指向位于當前節(jié)點的前一個節(jié)點卸奉。后退指針在程序從表尾向表頭遍歷時使用钝诚。

  • 分值(score):各個節(jié)點中的1.0、2.0和3.0是節(jié)點所保存的分值榄棵。在跳躍表中凝颇,節(jié)點按各自所保存的分值從小到大排列。

  • 成員對象(obj):各個節(jié)點中的o1疹鳄、o2和o3是節(jié)點所保存的成員對象拧略。

zskiplist結(jié)構:用于保存跳躍表節(jié)點的相關信息,比如節(jié)點的數(shù)量瘪弓,以及指向表頭節(jié)點和表尾節(jié)點的指針等等垫蛆。

  • header:指向跳躍表的表頭節(jié)點。

  • tail:指向跳躍表的表尾節(jié)點

  • level:記錄目前跳躍表內(nèi)腺怯,層數(shù)最大的那個節(jié)點的層數(shù)(表頭節(jié)點的層數(shù)不計算在內(nèi))

  • length:記錄跳躍表的長度袱饭,也即是,跳躍表目前包含節(jié)點的數(shù)量(表頭節(jié)點不計算在內(nèi)

跳躍表展示圖:

image

zskiplistNod 結(jié)構詳細介紹:

  • 結(jié)構定義:
image

跳躍表節(jié)點的level數(shù)組可以包含多個元素瓢喉,每個元素都包含一個指向其他節(jié)點的指針宁赤,程序可以通過這些層來加快訪問其他節(jié)點的速度,一般來說栓票,層的數(shù)量越多,訪問其他節(jié)點的速度就越快

image

查詢遍歷過程:

  • 1)迭代程序首先訪問跳躍表的第一個節(jié)點(表頭)愕够,然后從第四層的前進指針移動到表中的第二個節(jié)點走贪。

  • 2)在第二個節(jié)點時,程序沿著第二層的前進指針移動到表中的第三個節(jié)點惑芭。

  • 3)在第三個節(jié)點時坠狡,程序同樣沿著第二層的前進指針移動到表中的第四個節(jié)點。

  • 4)當程序再次沿著第四個節(jié)點的前進指針移動時遂跟,它碰到一個NULL逃沿,程序知道這時已經(jīng)到達了跳躍表的表尾婴渡,于是結(jié)束這次遍歷。

舉個查詢例子:

假如要查詢 數(shù)值為3.0的位置凯亮,從頭節(jié)點出發(fā)遍歷到3.0, 沿途經(jīng)歷的層:查找的過程只經(jīng)過了一個層边臼,并且層的跨度為3,所以目標節(jié)點在跳躍表中的位置為3假消。是不是很快柠并!

zskiplist 結(jié)構詳細介紹:

  • 結(jié)構定義:
image

通過使用一個zskiplist結(jié)構來持有這些節(jié)點,程序可以更方便地對整個跳躍表進行處理富拗,比如快速訪問跳躍表的表頭節(jié)點和表尾節(jié)點臼予,或者快速地獲取跳躍表節(jié)點的數(shù)量(也即是跳躍表的長度)等信息

跳躍表常見api

image

總結(jié)

  • 跳躍表是有序集合的底層實現(xiàn)之一。

  • Redis的跳躍表實現(xiàn)由zskiplist和zskiplistNode兩個結(jié)構組成啃沪,其中zskiplist用于保存跳躍表信息(比如表頭節(jié)點粘拾、表尾節(jié)點、長度)创千,而zskiplistNode則用于表示跳躍表節(jié)點缰雇。

  • 每個跳躍表節(jié)點的層高都是1至32之間的隨機數(shù)。

  • 在同一個跳躍表中签餐,多個節(jié)點可以包含相同的分值寓涨,但每個節(jié)點的成員對象必須是唯一的。?跳躍表中的節(jié)點按照分值大小進行排序氯檐,當分值相同時戒良,節(jié)點按照成員對象的大小進行排序。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冠摄,一起剝皮案震驚了整個濱河市译秦,隨后出現(xiàn)的幾起案子果复,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擦耀,死亡現(xiàn)場離奇詭異,居然都是意外死亡畔咧,警方通過查閱死者的電腦和手機违诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纸兔,“玉大人惰瓜,你說我怎么就攤上這事『嚎螅” “怎么了崎坊?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洲拇。 經(jīng)常有香客問我奈揍,道長曲尸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任男翰,我火速辦了婚禮另患,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奏篙。我一直安慰自己柴淘,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布秘通。 她就那樣靜靜地躺著为严,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肺稀。 梳的紋絲不亂的頭發(fā)上第股,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音话原,去河邊找鬼夕吻。 笑死,一個胖子當著我的面吹牛繁仁,可吹牛的內(nèi)容都是我干的涉馅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼黄虱,長吁一口氣:“原來是場噩夢啊……” “哼稚矿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捻浦,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晤揣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后朱灿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧识,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年盗扒,在試婚紗的時候發(fā)現(xiàn)自己被綠了跪楞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡侣灶,死狀恐怖习霹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炫隶,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布阎曹,位于F島的核電站伪阶,受9級特大地震影響煞檩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栅贴,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一斟湃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧檐薯,春花似錦凝赛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赚楚,卻和暖如春毙沾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宠页。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工左胞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人举户。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓烤宙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俭嘁。 傳聞我的和親對象是個殘疾皇子躺枕,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355