碼神營地-redis數據結構-list

reids數據結構-list
redis的幾個數據結構中list相對來說能稍微好理解一些,它的數據結構底層實現是雙向鏈表,因爲鏈表用的比較多,對其數據結構也是比較熟悉。我們來看一看源碼中的list是怎樣的。
更過關於redis操作和學習教程請進入碼神營地官網:www.icodegod.com

  • 數據結構
    redis的list定義在adlist.h中,在redis 2-x和redis高版本中redis 4-x中,list結構體的定義是一樣的:
    這裏寫圖片描述
    該文件中共有三個結構體的定義,listNode中是對鏈表節點的定義,一個prev前驅節點指針,next後繼節點指針,以及該節點的值value。第二個結構體是list迭代器結構體,包含一個指向鏈表節點的next指針和一個標誌迭代方向的direction(即正向迭代和逆向迭代)。第三個結構體是一個list的完整結構,表頭head,表尾tail,以及鏈表長度len,和三個用於多態鏈表的特定函數,dup用於複製鏈表節點所保存的值,free用於釋放節點值,match用於對比該節點值與另一給定值是否相等。

  • 內存結構

    這裏寫圖片描述
    每一個鏈表的頭和尾都指向listNode節點,多個listNode構成由prev和next構成一個無環雙向鏈表,同時支持使用迭代器進行節點迭代。節點空間的開闢是由malloc函數完成,釋放也是使用free函數。鏈表的創建過程調用背部封裝的zmalloc函數。zmalloc.h中封裝了malloc,calloc,realloc這三個基礎函數。

  • 鏈表特性
    1.時間複雜度
    redis鏈表使用len來標記鏈表長度,這樣獲取鏈表長度時間複雜度就爲O(1),head和tail指針,查找鏈表的頭和尾時間複雜度爲O(1),同時對於鏈表節點有prev和next指針,所以獲取某個節點的前驅節點和後繼節點的時間複雜度也爲O(1)。
    2.多態
    redis提供一系列特定API,如dup,free,match函數,能夠很方便的通過鏈表結構中的dup,free,match屬性以O(1)複雜度直接獲得相應操作結果。除一些複雜操作函數例如刪除給定節點,釋放給定鏈表等操作需要時間複雜度爲O(n),其餘操作大多在常數級,可以看出效率非常高。

  • 使用場景
    redis內部使用鏈表數據結構實現了列表鍵,還應用於發佈訂閱,慢查詢,監視器等,使用lpush,lpop或是rpush或rpop來生成隊列結構,使用lpush,rpop或是rpush,lpop來實現棧結構。



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