Redis學習 3 字典

2021-09-14 04:05:24 字數 2378 閱讀 5750

字典,別名符號表(symbol table),關聯陣列(associative array)或對映(map),是一種用於儲存鍵值對的抽象資料結構。c語言中雖然沒有內建字典這種資料結構,但是redis自己在底層實現了這種資料機構,並且其資料庫就是使用字典來作為底層實現。redis中的鍵(key)和值(value)相互關聯(這也是鍵對映為值),被稱為鍵值對,其實這就是資料結構字典的體現。字典中鍵是獨一無二的,因此程式只需要獲取到鍵就可以根據鍵找到相應的值。(很多資料庫也依據此為底層實現構成,資料庫的增刪改查都是基於對字典的操作)

這裡的鍵 k1,值「helloredis!」的鍵值對,就是存在了代表資料庫的字典裡面。

redis中字典使用雜湊表作為底層實現,乙個雜湊表裡面可以有多個雜湊表節點,每個雜湊表節點就儲存了字典中的乙個鍵值對。

redis字典使用的雜湊表由dict.h/dictht結構定義:

typedef struct dicthtdictht;
四個屬性的介紹:

1)table屬性:是乙個陣列,陣列中每個元素都是指標,並且指向ditc.h/ditchentry結構的指標,每個dictentry結構儲存乙個鍵值對。

2)size屬性:記錄table陣列大小。

3)used屬性:記錄雜湊表目前已有的節點(就是鍵值對)數量。

4)sizemask屬性:和雜湊值決定哪乙個鍵應該被放到table陣列的哪乙個索引上。

雜湊表節點使用dictentry結構表示,每個dictentry結構都儲存著乙個鍵值對。

typedof struct dictentryv;

//指向下個雜湊表節點,形成鍊錶

struct dictentry *next;

}dictentry;

redis中的字典有ditc.h/dict結構表示

typedef struct dict

typedef struct dicttypedicttype;

redis使用murmurhash2演算法來計算鍵的雜湊值。這個演算法的優點在於,即使輸入的鍵是有規律的,演算法依然能夠給出乙個很好的隨機分布性,並且演算法的計算速度也十分快。

鍵衝突:當兩個或兩個以上的鍵被分配到雜湊表陣列的同乙個索引上時,這些鍵就發生了衝突。

redis解決鍵衝突的方式時:鏈位址法。每個雜湊表節點都有乙個next指標,多個雜湊表節點可以使用next指標構成乙個單向鍊錶,被分配到同乙個索引上的多個節點可以通過這個單向鍊錶連線起來。就解決了鍵衝突的問題。

rehash:重新計算鍵的雜湊值和索引值,然後將ht[0]中的鍵值對放到ht[1]上去。

redis使用rehash操作來實現提高雜湊表的擴充套件或收縮效率。(隨著操作的進行,雜湊表儲存的鍵值對會逐漸的增多或減少,為了讓雜湊表的負載因子維持在乙個合理的範圍,就需要對雜湊表進行擴充套件或者收縮操作。)

rehash的步驟:

1)為字典ht[1]雜湊表分配空間。

2)將儲存的ht[0]中的全部鍵值對通過重新雜湊到ht[1]上去。

3)當ht[0]的鍵值對全部移到ht[1]上後,釋放ht[0],並將ht[1]設定為ht[0],然後在分配建立乙個新的ht[1],繼續下一次的rehash。

下圖展示為:漸進式rehash

redis的rehash採取漸進式rehash。漸進式rehash同時使用ht[0],ht[1]。這時,字典的刪除,查詢,更新現在ht[0]進行,然後在到ht[1]上進行。這個過程中,ht[0]上的鍵值對一直減少,直到變為空表。

因為這個rehash操作不是一次完成的,而是多次,乙個乙個將鍵值對從ht[0]移動到ht[1]。這樣漸進式的rehash分而治之避免了集中式rehash的龐大計算量,也處理了伺服器在對巨量的鍵值對的rehash操作。

Redis學習筆記(三) 字典

redis的字典使用雜湊表作為底層實現,乙個雜湊表中可以有多個雜湊表節點,而每個雜湊節點就儲存在字典中的乙個鍵值對。redis字典所用的雜湊表由disht結構定義。typedef struct dictht table 屬性是乙個陣列,陣列中的每個元素都是乙個指向dictentry結構的指標,每個d...

python3字典遍歷 python3字典遍歷

python版本 python3.7 info infog.get name 得到字典info中name的值 info.keys 得到字典info中所有的鍵,結果是乙個物件 dict keys name age 需要注意在python2中該操作得到的是乙個列表 遍歷key for temp in i...

Python自學3(字典)

1.像列表一樣,字典 是許多值的集合,但是不像列表的下標,字典的索引可以使用許多不同資料型別,不只是整數。字典的索引被稱為 鍵 鍵及其關聯的值稱為 鍵 值 對 2.字典中的表項是不排序的,不能像列表一樣進行切片。3.嘗試訪問字典中不存在的鍵,將導致keyerror出錯資訊 4.儘管字典時不排序的,但...