redis資料結構之字典

2021-07-25 12:48:56 字數 1345 閱讀 7930

字典(dictionary),其實和符號表(symbol table),關聯陣列(associative array),對映(map)是乙個東東,都是為了儲存鍵值對(k-v pair)的資料結構,屌屌噠。

php中因為能很方便的用關聯陣列,因此能寫出很多實用高效的**,有空一定要去好好了解下php的關聯陣列是如何實現的!

redis的字典資料結構由 dict, dicttype, dictht, dictentry構成(當然,像字典這種稍微複雜點的資料結構當然是自己設計了迭代器的。)

上述幾種資料結構的關係圖如下:

大概就是說字典嘛,以dict結構體為核心,dicttype是針對不同資料型別設定的特殊處理函式(包括雜湊方法,key複製,value複製,key對比,析構等函式),有了這個,dict可以支援不同型別的k-v pair,非常靈活,支援了多型字典。而dict中的privdata為一些特定函式提供了引數。

字典的更底層資料結構,是由雜湊表組成,而雜湊表,則是上圖中的dictht資料結構,乙個字典dict中有個雜湊表結構dictht的陣列,包含倆雜湊結構例項:ht[0]和ht[1]

單個雜湊表結構dictht包含乙個指向單個雜湊結點(dictentry)的二級指標,可以把它理解成乙個二維陣列,最終指向的雜湊結點結構dictentry則實際儲存著對應的k-v對

那麼問題來了,redis的雜湊演算法是什麼?如何解決碰撞的呢?

雜湊演算法:murmurhash2(教材上說最新的已經是murmurhash3了,這個有待擴充套件學習)

為什麼要維護兩個雜湊結構ht[0]和ht[1]呢?

雜湊表有個引數叫負載因子(load factor),定義是 已使用節點數/總的size, 由於採用了鏈位址發應對碰撞,所以已使用節點是完全可以大於總的size的。

一般情況下, 資料都是針對ht[0]來進行讀寫。當負載因子不合理時,需要對ht[0]的空間和資料進行重新整理,提高資料讀寫效率。

所以需要ht[1]作為一種緩衝,根據特定策略重新調整新的大小配置到ht[1],並逐步把ht[0]的資料搬移到ht[1]上,當資料和空間都折騰完畢後,ht[1]就可以當做ht[0]來應付正常的redis資料讀寫需求了,這時候再建立ht[1]備用,方便下次再調整。這整個過程稱作 「重複雜湊」(rehash),這樣動態地調整雜湊表結構,提高了讀寫效率。

同時由於rehash涉及到資料搬移,所以當ht[0]中儲存著大量資料時,redis當然不會無腦地移動大量資料,而是讓資料在執行增刪查改時,執行完後附帶把ht[0]的資料搬遷到ht[1]上,這就把乙個大的任務拆散成了很多小的行為,分而治之,提高了效率,這個過程稱為漸進式雜湊。

好睏,明天再補充吧。

redis資料結構 字典

1.1 雜湊表資料結構typedef struct dictht dictht 1.2 字典資料結構typedef struct dict dict 2.1 擴縮容條件 2.2 擴容流程 2.3 漸進式rehash 2.4 漸進式rehash場景3.1 迭代器資料結構 迭代器主要用於遍歷字典,遍歷資...

Redis資料結構 字典

1,字典,又稱為符號表 關聯陣列 或對映,是一種用於儲存鍵值對的抽象資料結構。2,redis的字典使用雜湊表作為底層實現,雜湊表的結構定義如下 typedef struct dicthtdicket table屬性是乙個陣列,陣列中的每個元素都是乙個指向dict.h dictentry結構的指標,每...

Redis資料結構 字典

字典在redis中應用廣泛,redis資料庫的底層就是使用字典來實現的,對資料庫的增刪查改也都是建立在字典的操作之上的。此外,字典還是雜湊鍵的實現之一。雜湊表由dict.h dictht結構定義 typedef struct dictht dictht 雜湊表節點使用dictentry結構表示,每個...