Redis學習 鍊錶原始碼分析

2022-05-05 02:45:07 字數 1718 閱讀 4512

0. 前言

redis 中的鍊錶是以通用鍊錶的形式實現的,而對於鍊錶的用途來說,主要的功能就是增刪改查,所以對於查詢來說,redis其提供了乙個match函式指標,使用者負責實現其具體的匹配操作,從而實現通用化。

涉及的檔案:adlist.h/adlist.c

1. 資料結構

typedef struct

listnode 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可以實現為:

1

void

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 節點的定義是很簡單的,這些...