Redis原始碼整理筆記 adlist與個人理解

2021-10-01 18:54:23 字數 2840 閱讀 1436

adlist採用雙向鍊錶的形式

list 列表定義

// 定義list列表

typedef struct list list;

list 迭代器

// list 迭代器,單向

typedef struct listiter listiter;

listnode節點

// 定義listnode節點

typedef

struct listnode listnode;

adlist 常用的方法

// 巨集定義的一些操作

#define listlength(l) ((l)->len) // list長度

#define listfirst(l) ((l)->head) // 獲取list 頭部

#define listlast(l) ((l)->tail) // 獲取list 尾部

#define listprevnode(n) ((n)->prev) // 獲取某節點的上乙個節點

#define listnextnode(n) ((n)->next) // 獲取某節點下乙個節點

#define listnodevalue(n) ((n)->value) // 獲取某節點的值,對應的是個函式指標

// 分別設定和獲取dup、free、match

#define listsetdupmethod(l,m) ((l)->dup = (m)) // list的複製函式的設定

#define listsetfreemethod(l,m) ((l)->free = (m)) // list的釋放函式的設定

#define listsetmatchmethod(l,m) ((l)->match = (m)) // list的匹配函式的設定

#define listgetdupmethod(l) ((l)->dup) // list的複製函式的獲取

#define listgetfree(l) ((l)->free) // list的釋放函式的獲取

#define listgetmatchmethod(l) ((l)->match) // list的釋放函式的獲取

/* prototypes */

// 方法原型

list *listcreate(void); //建立乙個list列表

void listrelease(list *list); // 釋放乙個list

void listempty(list *list); // 將list置空

list *listaddnodehead(list *list, void *value); // 在list頭部新增節點

list *listaddnodetail(list *list, void *value); // 在list尾部新增節點

// 在list某個節點後面插入節點

list *listinsertnode(list *list, listnode *old_node, void *value, int after);

void listdelnode(list *list, listnode *node); // 刪除指定節點

listiter *listgetiterator(list *list, int direction); // 獲取list的迭代器

listnode *listnext(listiter *iter); // 利用list迭代器獲取的下乙個節點

void listreleaseiterator(listiter *iter); // 釋放list迭代器

list *listdup(list *orig); // 列表的複製

listnode *listsearchkey(list *list, void *key); // 在list列表中查詢某個值對應的節點

listnode *listindex(list *list, long index); // 獲取list列表中某個位置的節點

void listrewind(list *list, listiter *li); // 重置迭代器方向從頭部開始

void listrewindtail(list *list, listiter *li); // 重置迭代器方向從尾部開始

void listrotate(list *list); // list 翻轉

void listjoin(list *l, list *o); // 將o 列表對應的節點插入到l 列表中

/* directions for iterators */

// 巨集定義 迭代器的方向 0:從頭部向尾部,1:從尾部向頭部

#define al_start_head 0

#define al_start_tail 1

#endif /* __adlist_h__ */

redis原始碼閱讀筆記

在redis中乙個資料庫結構體是這樣的 每個dict是乙個hash表 typedef struct redisdb redisdb dict欄位中存放以key值為鍵,以value指標為值的hash表項dict根據型別的不同分為如下幾種 1 字串 string 操作 set key value get...

redis原始碼學習筆記

目錄 1 從資料結構開始 圖為原始碼,附帶個人簡單分析 a 動態字串 檔案 sds.h sds.c 前言 s sizeof struct sdshdr 的解釋為buf為柔性陣列,不占用空間,僅僅為偏移量,所以s指標向後退乙個結構體大小為結構體位址所在。分析 這個結構是整個動態字串的基礎,sds為 s...

redis原始碼筆記 ae epoll c

這部分 是具體事件觸發網路庫的底層實現。linux下有epoll設施,而且其效率是現在最高的。注意即使高效如redis,其也只是選擇了自動檔 水平觸發 自動檔和手動檔的典故請自行google 據說libevent也是使用的水平觸發。廢話不多說,看 吧。1 include 2 3 typedef st...