本文分析的是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的作用了。也讓我見...