1. 程式人生 > >Redis底層資料結構--連結串列

Redis底層資料結構--連結串列

這是普通的連結串列實現, 連結串列結點不直接持有資料, 而是通過void *指標來間接的指向資料. 其實現位於 src/adlist.hsrc/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

這是一個平平無奇的連結串列的實現. list在Redis除了作為一些Value Type的底層實現外, 還廣泛用於Redis的其它功能實現中, 作為一種資料結構工具使用. 在list的實現中, 除了基本的連結串列定義外, 還額外增加了:

  1. 迭代器listIter的定義, 與相關介面的實現.
  2. 由於list中的連結串列結點本身並不直接持有資料, 而是通過value欄位, 以void *指標的形式間接持有, 所以資料的生命週期並不完全與連結串列及其結點一致. 這給了list的使用者相當大的靈活性. 比如可以多個結點持有同一份資料的地址. 但與此同時, 在對連結串列進行銷燬, 結點複製以及查詢匹配時, 就需要list
    的使用者將相關的函式指標賦值於list.duplist.freelist.match欄位.