鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地調整鍊錶的長度。
鍊錶在redis中的應用非常廣泛,比如列表鍵(?)的底層實現之一就是鍊錶。
除了鍊錶鍵之外,發布與訂閱,慢查詢,監視器等功能也用到了鍊錶,redis伺服器本身還使用鍊錶來儲存多個客戶端的狀態資訊,以及使用鍊錶來構建客戶端輸出緩衝區(output buffer)。
鍊錶節點 adlist.h/listnode
typedef struct listnode listnode;
雖然僅僅使用多個listnode結構姐可以組成鍊錶,但使用adlist.h/list來操作鍊錶的話,操作起來會更方便:
typedef struct list list;
redis的鍊錶實現的特性可以總結如下:
1.雙向:鍊錶節點帶有prev和next指標,獲取某個節點的前置節點和後置節點的複雜度都是o(1)。
2.無環。
3.帶表頭指標和表尾指標,通過list結構的head指標和tail指標,程式獲取鍊錶的表頭節點和表尾節點的複雜度為o(1)。
4.帶鍊錶長度計數器:程式使用list結構的len屬性來對list持有的鍊錶節點進行計數,程式獲取鍊錶中節點數量的複雜度為o(1)。
5.「多型」:鍊錶節點使用void*指標來儲存節點值,並且可以通過list結構的dup,free,match三個屬性為節點值設定型別特定函式,所以鍊錶可以用於儲存各種不同型別的值。
Redis設計與實現 2 鍊錶
鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地跳轉鍊錶的長度。作為一種常用資料結構,鍊錶內建在很多高階的程式語言裡面,因為redis使用c語言並沒有內建這種資料結構,所以redis構建了自己的鍊錶實現。鍊錶在redis中的應用非常多,比如列表鍵的底層實現之一就是...
Redis設計與實現讀書筆記(二) 鍊錶
鍊錶作為最基礎的資料結構,在許多高階語言上已經有了很好的實現。由於redis採用c語言編寫,需要自己實現鍊錶,於是redis在adlist.h定義了鍊錶型別。作者對於這部分沒什麼好說,原始碼比較簡單,如果這方面沒有接觸過的話,作者也耐心地推薦了幾本書供參考。為了提高效率,這裡的鍊錶指的是雙向鍊錶,使...
27 Redis設計與實現 鍊錶
鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地調整鍊錶的長度。作為一種常用資料結構,鍊錶內建在很多高階的程式語言裡面,因為redis 使用的c 語言並沒有內建這種資料結構,所以redis 構建了自己的鍊錶實現。鍊錶在redis 中的應用非常廣泛,比如列表鍵的底層...