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來實現棧結構。