Redis原始碼閱讀筆記(二)list雙向鍊錶結構

2021-08-21 18:45:17 字數 906 閱讀 1376

- list簡介

相對於sds來說,list並沒有太多新的想法和機制,就和自己實現乙個雙向鍊錶差不多,主要有節點結構、鍊錶結構和迭代器結構三個部分。

只有乙個比較新奇的想法是,因為在儲存節點的值時,使用的是乙個void * 指標,而對void * 裡面的資料則可以自己定義一些節點值的複製、釋放和比較函式。但是就c語言來說結構體是不具有成員函式的,為了讓節點值操作函式能夠和鍊錶繫結,在鍊錶結構中儲存了相應和函式指標作為成員變數,以此來達到目的。

- list具體實現 ``` typedef struct listnode listnode;

typedef struct listiter listiter;

typedef struct list list;

- list函式操作
//鍊錶建立,失敗返回null,成功返回指向鍊錶的指標

list *listcreate(void)

//釋放鍊錶:包括釋放節點中的值,釋放節點結構,釋放鍊錶結構

void listrelease(list *list)

zfree(list); //釋放鍊錶結構}

/*

因為list的函式操作基本都很簡單,這裡就不一一列出了,只提幾點值得注意的地方。

1.在進行鍊錶的複製,節點的比較時,如果當前鍊錶定義了值操作函式就要呼叫值操作來完成相應的複製和比較。

2.在釋放鍊錶時,主要有三個步驟,首先若有值釋放函式則需要對節點值進行釋放,然後對逐個節點結構進行釋放,最後要對該鍊錶結構進行釋放。

3.在迭代器使用時,因為確保了迭代器內部next指標的有效性,可以對當前節點進行包括刪除在內的各種操作,但是不能操作非迭代器指向的節點。同時也正是為了確保有效性,通常在使用迭代器函式時,迭代器都會自動指向下乙個節點。

redis原始碼閱讀筆記

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

Redis學習筆記 原始碼閱讀 整數集合

整數集合 intset 是乙個有序的 儲存整型資料的結構,當redis集合型別的元素都是整數並且都處在64位有符號整數範圍之內時,使用該結構體儲存。在兩種情況下,底層編碼會發生轉換。整數集合在redis中可以儲存int16 t int32 t int64 t型別的整型資料,並且可以保證集合中不會出現...

閱讀筆記 fsnotify原始碼閱讀

fsnotify的github位址是 fsnotify是乙個資料夾監控應用。可以使用建立乙個watcher來對某個資料夾進行監控 檔案目錄很簡單,實際就兩個程式檔案,fsnotify.go 和 各平台的fsnotify go 後乙個檔案是各個不同平台的實現 example test.go中給的是最簡...