Redis原始碼 dict資料結構(實現)

2021-07-30 05:58:12 字數 1838 閱讀 8998

本文分析的是src/dict.c檔案。

從結構上來說,可以分為:

1. 私有函式(以下劃線開頭的一般都是,一般都是一些輔助函式);

2. 公開api。

從功能來說,可以分為:

1. dict初始化、析構;

2. 元素操作:查詢、刪除、插入、替換/修改值、清空資料;

3. 遍歷dict,迭代器相關(比如需要持久化雜湊表的資料時就很有用);

4. 擴充套件雜湊表(也就是增量擴充套件雜湊表);

5. 雜湊函式(這些需要數學知識才能懂,個人覺得開箱即用就好了);

6. 隨機化函式……(目前不知道有什麼用)。

讀完之後,我個人覺得,重點是理解好incremental rehashing是怎麼做的以及雜湊表的基本操作,其它的都很容易了。

先回顧一下dict的定義,這對理解初始化和析構有好處:

typedef struct dict  dict;
可以看到,其中除了基礎型別(long和int)之外,還有指標和乙個dictht陣列。一般指標初始化為null就好了,然後rehashidx的初始值應該是-1,iterators的初始值應該是0,然後我的一些想法寫成了注釋放在**裡。

關於建立和初始化,涉及到下面三個函式:

// 其實我覺得這個函式名應該改為_dicthtinit才對,

// 因為既不是對dict修改(而是對dictht進行修改),

// 也不是reset操作(而是初始化操作)

static void _dictreset(dictht *ht)

/* create a new hash table */

// 其實我到現在還不知道privdata是什麼……待補充

dict *dictcreate(dicttype *

type,

void

*privdataptr)

/* initialize the hash table */

// 上面這行注釋也有問題,其實是initialize the dict……

// 機靈的朋友趕緊做pull request,說不定真的可以被accept

// 還有很多地方的**風格不統一,比如函式傳參時多個引數之間只有逗號沒有空格

int _dictinit(dict *d, dicttype *

type,

void

*privdataptr)

關於dict的銷毀,涉及到下面兩個函式,關鍵知識點是,如何釋放動態建立的內容。

/* destroy an entire dictionary */

// 噢...注釋又錯了,應該是destroy an entire dict hash table

int _dictclear(dict *d, dictht *ht, void(callback)(void *))

}/* free the table and the allocated cache structure */

zfree(ht->table);

/* re-initialize the table */

_dictreset(ht);

return dict_ok; /* never fails */

}/* clear & release the hash table */

// 值得注意的是,只有動態建立的資料需要自己釋放

// 還有,它的程式設計風格,一下子有空格,一下子沒有,but not big deal.

void dictrelease(dict *d)

later……

redis原始碼剖析 dict

typedef struct dictentry v struct dictentry next dictentry typedef struct dicttype dicttype this is our hash table structure.every dictionary has two ...

redis原始碼之dict

大家都知道redis預設是16個db,但是這些db底層的設計結構是什麼樣的呢?我們來簡單的看一下原始碼,重要的字段都有所注釋 typedef struct redisdb redisdb redis中的所有kv都是存放在dict中的,dict型別在redis中非常重要。字典disc的資料結構如下 t...

Redis原始碼分析(三) dict雜湊結構

昨天分析完adlist的redis 今天馬上馬不停蹄的繼續學習redis 中的雜湊部分的結構學習,不過在這裡他不叫什麼hashmap,而是叫dict,而且是一種全新設計的一種雜湊結構,他只是通過幾個簡單的結構體,再搭配上一些比較常見的雜湊演算法,就實現了類似高階語言中hashmap的作用了。也讓我見...