Redis--跳躍表

什麼是跳躍表*
跳躍表是一種有序的數據結構,它通過在每個節點中維持多個指向其他的幾點指針,從而達到快速訪問隊尾目的。跳躍表的效率可以和平衡樹想媲美了,最關鍵是它的實現相對於平衡樹來說,代碼的實現上簡單很多。

跳躍表用在哪
說真的,跳躍表在 Redis 中使用不是特別廣泛,只用在了兩個地方。一是實現有序集合鍵,二是集羣節點中用作內部數據結構

跳躍表原理
我們先來看一下一張完整的跳躍表的圖。(圖片來自《Redis 設計與實現》)



跳躍表的 level 是如何定義的?
跳躍表 level 層級完全是隨機的。一般來說,層級越多,訪問節點的速度越快

跳躍表的插入
首先我們需要插入幾個數據。鏈表開始時是空的。

插入 level = 3,key = 1
當我們插入 level = 3,key = 1 時,結果如下:

插入 level = 1,key = 2
當繼續插入 level = 1,key = 2 時,結果如下

插入 level = 2,key = 3
當繼續插入 level = 2,key = 3 時,結果如下

插入 level = 3,key = 5
當繼續插入 level = 3,key = 5 時,結果如下

插入 level = 1,key = 66
當繼續插入 level = 1,key = 66 時,結果如下

 

插入 level = 2,key = 100
當繼續插入 level = 2,key = 100 時,結果如下

上述便是跳躍表插入原理,關鍵點就是層級–使用拋硬幣的方式,感覺還真是挺隨機的。每個層級最末端節點指向都是爲 null,表示該層級到達末尾,可以往下一級跳。

跳躍表的查詢

現在我們要找鍵爲 66 的節點的值。那跳躍表是如何進行查詢的呢?

跳躍表的查詢是從頂層往下找,那麼會先從第頂層開始找,方式就是循環比較,如過頂層節點的下一個節點爲空說明到達末尾,會跳到第二層,繼續遍歷,直到找到對應節點。

如下圖所示紅色框內,我們帶着鍵 66 和 1 比較,發現 66 大於 1。繼續找頂層的下一個節點,發現 66 也是大於五的,繼續遍歷。由於下一節點爲空,則會跳到 level 2。



                                                                                                頂層遍歷

上層沒有找到 66,這時跳到 level 2 進行遍歷,但是這裏有一個點需要注意,遍歷鏈表不是又重新遍歷。而是從 5 這個節點繼續往下找下一個節點。如下,我們遍歷了 level 3 後,記錄下當前處在 5 這個節點,那接下來遍歷是 5 往後走,發現 100 大於目標 66,所以還是繼續下沉。


                                                                                                    第二層遍歷
當到 level 1 時,發現 5 的下一個節點恰恰好是 66 ,就將結果直接返回。

                                                                                                     遍歷第一層

跳躍表刪除
跳躍表的刪除和查找類似,都是一級一級找到相對應的節點,然後將 next 對象指向下下個節點,完全和鏈表類似。

現在我們來刪除 66 這個節點,查找 66 節點和上述類似。

接下來是斷掉 5 節點 next 的 66 節點,然後將它指向 100 節點。

如上就是跳躍表的刪除操作了,和我們平時接觸的鏈表是一致的。當然,跳躍表的修改,也是和刪除查找類似,只不過是將值修改罷了,就不繼續介紹了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章