redis的字典使用雜湊表作為底層實現,乙個雜湊表中可以有多個雜湊表節點,而每個雜湊節點就儲存在字典中的乙個鍵值對。
redis字典所用的雜湊表由disht結構定義。
typedef
struct dictht
table 屬性是乙個陣列,陣列中的每個元素都是乙個指向dictentry結構的指標,每個dictentry結構儲存著乙個鍵值對。其他的屬性不多說。
雜湊表節點
雜湊表節點使用dictentry結構標識,每個dictentry儲存乙個鍵值對。
typedef
struct dictentry v;
//值struct dictentry *next;
//指向下個雜湊節點,形成鍊錶
} ductentry;
*next 屬性是指向另乙個雜湊表節點的指標,這個指標可以將多個雜湊值相同的鍵值對連線在一起,解決鍵衝突的問題。所以,每乙個雜湊索引為乙個單向鍊錶。
redis中的字典由dict結構表示:
typedef
struct dict dict;
redis計算雜湊值和索引值的方法:
hash = dict->type->
hashfunction
(key)
;index = hash & dict->ht[x]
.sizemask;
解決鍵衝突:當兩個或兩個乙個數量的鍵被分配到了雜湊表陣列的同乙個索引上面時,為我們稱作這些鍵發生衝突。redis的雜湊表使用鏈位址法來解決衝突,每個雜湊表節點的next指標構成了乙個單向鍊錶,以此來解決鍵衝突。
另外由於鍊錶沒有指向鍊錶結尾的指標,為考慮速度,每次將新加的節點放到煉表表頭位置(複雜度為o(1))。
rehash
隨著雜湊表儲存的鍵增多或減少,為了讓雜湊表的負載因子維持在乙個合理的範圍內,程式會對雜湊表的小小進行rehash(重新雜湊)。
1、為字典表的ht[1]雜湊表分配空間,這個雜湊表的空間大小取決於要執行的操作以及ht[0]包含的鍵值對數量
(1)如果執行擴充套件,ht[1] =第乙個》=ht[0].used * 2 的2的n次方冪。
(2)如果收縮 ht[1] = 第乙個》=ht[0].used 的2的n次方冪
2、h[0] 遷移至h[1]。
3、清空h[0],將h[1]設定為h[0],新建h[1]。
漸進式rehash字典表同時使用ht[0],ht[1],ht[0]通過索引計數器分批量的遷移至ht[1],為解決ht[0]所持有的鍵值對量太大的問題。
每天學一點,總會有收穫。
python學習筆記 三 字典
字典是一種對映型別的資料型別。辣麼什麼是對映呢?如果看過 資料結構與演算法 這一本書的小夥伴應該有印象 我也只是大學學習過,嘻嘻 對映 就是將兩個集合一 一對應起來,通過集合a的值,集合b有且只有乙個與之對應。字典是python中唯一的內建對映型別。字典以類似於下面的方式表示 phonebook 字...
我的pythonx學習筆記(三) 字典
字典 python 中的字典是一種對映型別資料,裡面的資料是鍵值對,python中的字典是基於hash實現的。建立字典 3種構造字典的方 a a a dict x 1 y 2 a fromkeys x y 4 字典是無序的,hash表的實現也是無序的 訪問字典的元素 print a x 往字典中插入...
python基礎(三)字典
1.字典的用途 字典的名稱指出了這種資料結構的用途。普通圖書適合按從頭到尾的順序閱讀,如果你願意,可快速翻到任何一頁,這有點像python中的列表。字典 日常生活中的字典和python字典 旨在讓你能夠輕鬆地找到特定的單詞 鍵 以獲悉其定義 值 在很多情況下,使用字典都比使用列表更合適。下面是pyt...