0. 前言
redis 中的鍊錶是以通用鍊錶的形式實現的,而對於鍊錶的用途來說,主要的功能就是增刪改查,所以對於查詢來說,redis其提供了乙個match函式指標,使用者負責實現其具體的匹配操作,從而實現通用化。
涉及的檔案:adlist.h/adlist.c
1. 資料結構
typedef structlistnode listnode;
typedef
struct
listiter listiter;
typedef
struct
list list;
#define listsetdupmethod(l,m) ((l)->dup = (m))#define listsetfreemethod(l,m) ((l)->free = (m))
#define listsetmatchmethod(l,m) ((l)->match = (m))
其中提供了dup,free,match的函式指標,使用者可以通過設定該函式指標,來訪問特定型別的資料。
2. api實現:
只提取幾個主要的api,該檔案完整的注釋在githud上(使用者名稱:jabnih)
a. listrelease
對於釋放鍊錶的操作,其中對於每個節點的釋放會判斷使用者是否設定了free函式,若有則執行使用者的操作,用以釋放特定型別資料。例如:value為指向乙個從堆分配的字元陣列,在釋放該節點的時候,就需要先釋放value記憶體
對於free可以實現為:
1void
free(void *value)
2
1//釋放鍊錶
2void listrelease(list *list)317
zfree(list);
18 }
b. listdup
當執行複製的時候,對於設定了dup函式可以實現深度複製或自定義複製的功能。
1//複製鍊錶,若有鍊錶有dup,則呼叫該函式進行深度複製,否則直接複製節點的值(淺複製)
2 list *listdup(list *orig)
327 } else
28//
淺複製29 value = node->value;
3031
//將複製後的節點新增的copy鍊錶尾部
32if (listaddnodetail(copy, value) ==null) 37}
38listreleaseiterator(iter);
39return
copy;
40 }
c. listsearchkey
1//查詢節點,如果設定了match方法,則使用match方法比較,否則僅僅比較節點的value值
2 listnode *listsearchkey(list *list, void *key)
315 } else20}
21}22listreleaseiterator(iter);
23return
null;
24 }
3. 總結
1. 通用鍊錶實現
2. 對外提供擴充套件,使用者可以自定義查詢,複製,釋放的功能。
Redis原始碼學習 雙向鍊錶adlist
鍊錶結點中儲存兩個指標,分別指向前後,還有乙個void 指標指向儲存的資料 typedef struct listnode listnode 鍊錶,包含兩個鍊錶節點指標,乙個指向head,乙個指向tail 其中dup函式指標指向兩個鍊錶拷貝時對鍊錶節點value的拷貝方法。match為尋找鍊錶中和k...
redis原始碼之鍊錶list
未完待續 1.簡介 離散,無序的資料結構。鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地調整鍊錶的長度。鍊錶被廣泛用於實現 redis 的各種功能,比如列表鍵,發布與訂閱,慢查詢,監視器,等等。2.定義 鍊錶節點 typedef struct listnode ...
Redis鍊錶(adlist) 含原始碼
鍊錶作為經典且常用的資料結構,在很多高階程式語言中都內建了鍊錶這種資料額結構,但是redis是有c語言實現,並沒有內建這種資料結構,所以redis自身構建了鍊錶。節點和鍊錶的實現 listnode結構表示為 typedef struct listnode listnode 節點的定義是很簡單的,這些...