Redis底層資料結構--連結串列
阿新 • • 發佈:2018-11-20
這是普通的連結串列實現, 連結串列結點不直接持有資料, 而是通過void *
指標來間接的指向資料. 其實現位於 src/adlist.h
與src/adlist.c
中, 關鍵定義如下:
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value; } listNode; typedef struct listIter { listNode *next; int direction; } listIter; typedef struct list { listNode *head; listNode *tail; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr, void *key); unsigned long len; } list;
其記憶體佈局如下圖所示:
這是一個平平無奇的連結串列的實現. list
在Redis除了作為一些Value Type的底層實現外, 還廣泛用於Redis的其它功能實現中, 作為一種資料結構工具使用. 在list
的實現中, 除了基本的連結串列定義外, 還額外增加了:
- 迭代器
listIter
的定義, 與相關介面的實現. - 由於
list
中的連結串列結點本身並不直接持有資料, 而是通過value
欄位, 以void *
指標的形式間接持有, 所以資料的生命週期並不完全與連結串列及其結點一致. 這給了list
的使用者相當大的靈活性. 比如可以多個結點持有同一份資料的地址. 但與此同時, 在對連結串列進行銷燬, 結點複製以及查詢匹配時, 就需要list
list.dup
,list.free
,list.match
欄位.