redis6 0原始碼雙端鍊錶

2021-10-05 15:12:53 字數 1872 閱讀 8572

在redis中列表鍵,發布和訂閱、慢查詢、監視器等都用到了鍊錶,redis伺服器本身還是用鍊錶來儲存多個客戶端的狀態資訊,以及使用鍊錶來構建客戶端輸出緩衝區。

鍊錶節點adlist.h/listnode

typedef

struct listnode listnode;

typedef

struct list list;

建立乙個不包含任何節點的新鍊錶

list *

listcreate

(void

)

list *

listaddnodehead

(list *list,

void

*value)

else

list->len++

;return list;

}

list *

listaddnodetail

(list *list,

void

*value)

else

list->len++

;return list;

}

/* functions implemented as macros */

#define listlength(l) ((l)->len) //返回鍊錶長度

#define listfirst(l) ((l)->head) //返回鍊錶的表頭節點

#define listlast(l) ((l)->tail) //返回鍊錶的表尾節點

#define listprevnode(n) ((n)->prev) //返回給定節點的前置節點

#define listnextnode(n) ((n)->next) //返回給定節點的後繼節點

#define listnodevalue(n) ((n)->value)//返回給定節點的值

#define listsetdupmethod(l,m) ((l)->dup = (m))

#define listsetfreemethod(l,m) ((l)->free = (m))

#define listsetmatchmethod(l,m) ((l)->match = (m))

#define listgetdupmethod(l) ((l)->dup)

#define listgetfreemethod(l) ((l)->free)

#define listgetmatchmethod(l) ((l)->match)

typedef

struct listiter listiter;

listiter *

listgetiterator

(list *list,

int direction)

void

listreleaseiterator

(listiter *iter)

listnode *

listnext

(listiter *iter)

return current;

}

listnode *

listsearchkey

(list *list,

void

*key)

}else}}

return

null

;}

Redis原始碼剖析 雙端鍊錶Sdlist

redis為雙端鍊錶的每乙個節點定義了如下的結構體。鍊錶節點定義 typedef struct listnode listnode 與一般的雙端鍊錶無異,定義了鍊錶節點的結構體之後,下面就定義鍊錶的結構體,用來方便管理鍊錶節點,其結構體定義如下 typedef struct list list re...

redis 雙端鍊錶

鍊錶作為陣列之外的一種常用序列抽象,是大多數高階語言的基本資料型別,因為c 語言本身不支援鍊錶型別,大部分c 程式都會自己實現一種鍊錶型別,redis 也不例外.雙端鍊錶的應用 雙端鍊錶作為一種通用的資料結構,在redis 內部使用得非常多 它既是redis 列表結構的底層實現之一,還被大量redi...

redis原始碼之鍊錶list

未完待續 1.簡介 離散,無序的資料結構。鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地調整鍊錶的長度。鍊錶被廣泛用於實現 redis 的各種功能,比如列表鍵,發布與訂閱,慢查詢,監視器,等等。2.定義 鍊錶節點 typedef struct listnode ...