鍊錶的使用十分廣泛,甚至很多高階程式語言都內建了這種資料結構。但是c語言卻不沒有。不過c語言編寫的redis卻自己構建了鍊錶這種資料結構在自己內部。
127.0.0.1:6379> lpush list a b c d e //向鍊錶中新增a b c d e f
(integer) 5 //此時鍊錶中的資料個數
127.0.0.1:6379> rpush list f g //在向鍊錶中新增 f g (在a b c d e f 後新增)
(integer) 7
127.0.0.1:6379> lrange list 0 -1 //輸出鍊錶中所有資料
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
6) "f"
7) "g"
127.0.0.1:6379>
注:redis列表是簡單的字串列表,按照插入順序排序。新增乙個元素到列表的頭部(左邊)或者尾部(右邊)
乙個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)。
l range返回列表中指定區間內的元素,區間以偏移量 start 和 end 指定。 其中 0 表示列表的第乙個元素, 1 表示列表的第二個元素,以此類推。 你也可以使用負數下標,以 -1 表示列表的最後乙個元素, -2 表示列表的倒數第二個元素,以此類推。
redis中很多地方都用到了鍊錶這一資料結構:鍊錶鍵,發布和訂閱,慢查詢,監視器等功能。redis伺服器也使用鍊錶來儲存多個客戶端的狀態資訊和構建客戶端輸出緩衝區。
每個鍊錶節點使用乙個adlist.h/listnode結構來實現
typedef struct listnodelistnode;
通過前驅和後繼就可以將乙個個鍊錶節點連起來組成鍊錶了。
redis也提供了另外一種形式的鍊錶結構adlist.h/list
typedef struct listlist;
這樣的list函式為鍊錶提供了頭指標head,尾指標tail,記錄長度的len。還有操作函式dup,free,match.
dup函式:用於複製鍊錶節點所儲存的值。
free函式:用於釋放節點儲存的值
match函式:用於對比鍊錶節點所儲存的值和另乙個值是否相等。
1,雙端:listnode有前驅(prev)和後繼(next)指標,因此可以獲取某個節點的前驅節點後後繼節點。複雜度為o(1)。
2,無環:表頭節點無前驅節點(表頭的prev指標指向null),表尾節點無後繼節點(表尾的next指標指向null)。
3,多型:鍊錶節點可以使用void*指標來儲存節點值,並且可以通過list結構中的dup,free,match三個屬性為節點值設定型別特定的函式,所以鍊錶可以用於儲存各種不同型別的值。
4,節點計數器:可以方便的獲得list中節點的數量。複雜度為o(1)。
5,頭結點(head)和尾結點(tail):頭結點和尾節點的使用可以方便的獲得鍊錶的頭結點和尾結點。時間複雜度為o(1)。
Redis原理再學習 鍊錶 list
鍊錶 linked list 是一種基礎資料結構,是一種線性表,但是不會按照線性表的順序儲存資料,而是在每乙個節點裡存到下乙個節點的指標。鍊錶插入節點時是 o 1 複雜度,比線性表順序表快。鍊錶訪問節點或訪問特殊節點時是 o n 複雜度時間,順序表相應複雜度是 o logn 和o 1 維基百科 鍊錶...
redis原始碼之鍊錶list
未完待續 1.簡介 離散,無序的資料結構。鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地調整鍊錶的長度。鍊錶被廣泛用於實現 redis 的各種功能,比如列表鍵,發布與訂閱,慢查詢,監視器,等等。2.定義 鍊錶節點 typedef struct listnode ...
鍊錶 List
stl中,list class list 的乙個例項 使用乙個doubly linked list管理元素。list不支援隨機訪問,但任何位置上執行元素的安插和移動都非常快。雙向鍊錶 doubly linked list 使用list時必須先包含標頭檔案 include其中list型別系定義於nam...