redis資料結構 字典

2021-10-10 07:02:00 字數 1543 閱讀 8715

1.1 雜湊表資料結構

typedef

struct dictht dictht;

1.2 字典資料結構
typedef

struct dict dict;

2.1 擴縮容條件

2.2 擴容流程

2.3 漸進式rehash

2.4 漸進式rehash場景3.1 迭代器資料結構

迭代器主要用於遍歷字典,遍歷資料的原則為:不重複出現資料、不遺漏任何資料

typedef

struct dictiterator dictiterator;

3.2 普通迭代器

3.3 安全迭代器

static

void

_dictrehashstep

(dict *d)

4.1 索引更新方式

通常情況下,遍歷情況下的索引更新方式為從0遞增到size-1,可以保證所有資料不會遺漏。但在discan遍歷方式中,索引更新方式採用了另外一種策略,從高位開始遞增。**如下,如長度為8的情況,索引順序為000-100-010-110-001-101-011-111

v |

=~m1;

//m1為雜湊表掩碼

v =rev(v)

;//二進位制逆轉

v++; v =

rev(v)

;//二進位制逆轉

static

unsigned

long

rev(

unsigned

long v)

return v;

}

4.2 遍歷方式

針對遍歷,我們要考慮三種情況,未進行擴縮容,迭代中正在進行rehash,迭代過程中已完成擴縮容。

未進行擴縮容,則只需按照當前索引更新方式遍歷雜湊表ht[0]即可。

迭代過程中已完成擴縮容,即仍只需要遍歷雜湊表ht[0]即可。實例如:假設hash表大小為4,進行第3次迭代時,hash表擴容到了8。此時我們發現,迭代只進行6次就完成了,順序為0、2、1、5、3、7,擴容後少遍歷了4、6,因為游標為0、2的資料在擴容前已經迭代完,而hash表大小從4擴容至8,再經過rehash後,游標為0、2的資料可能會分布在0|42|6上,因此擴容後的游標4、6不需要再迭代。

迭代過程中正在rehash,則需要遍歷雜湊表ht[0]和ht[1],假設size更小的為t[0],大的為t[1],則根據當前的索引值,遍歷t[0]上的資料,還需要遍歷t[1]該索引值高位為1的資料。t[1]遍歷的 條件為while(v & (m0 ^ m1))。實例如:ht[0]大小為8,ht[1]大小為32,當前索引為011,則在ht[1]需要遍歷的位置順序為00011、10011、01011、11011。高位逐漸+1的過程。

Redis資料結構 字典

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

Redis資料結構 字典

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

redis資料結構之字典

字典 dictionary 其實和符號表 symbol table 關聯陣列 associative array 對映 map 是乙個東東,都是為了儲存鍵值對 k v pair 的資料結構,屌屌噠。php中因為能很方便的用關聯陣列,因此能寫出很多實用高效的 有空一定要去好好了解下php的關聯陣列是如...