在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 ...