1 回答

TA貢獻1799條經驗 獲得超9個贊
redis的字典底層實現為hash表、
hash表由dict.h/dictht結構定義:
[cpp] view plain copy
typedef struts dictht{
//哈希表數組
dictEntry **table;
//哈希表數組
unsigned long size;
//哈希表大小掩碼,用于計算索引值
//總是等于size-1
unsigned long sizemask;
//該hash表已有節點的數量
unsigned long used;
}dictth;
table屬性是一個數組,每個元素指向一個 hash表節點的指針。
hash表節點的由dict.h/dictEntry結構定義
[cpp] view plain copy
<pre name="code" class="cpp">typedef struts dictEntry{
//鍵
void *key;
//值
union{
void *val;
uint64_tu64;
int64_ts64;
}
//指向下個hash表節點,形成鏈表
strut dictEntry *next;
}dictEntry;
鍵值對的值可以是指針,uint64_t整數,或者是int64_t整數。
next屬性的作用是:如果多個鍵值對的hash值相同,它們會成為一個單向鏈表,來解決沖突。
redis中的字典由 dict.h/dict結構來定義
[cpp] view plain copy
typedef struts dict{
<pre name="code" class="cpp"><pre name="code" class="cpp"> //類型特定函數
dictType *type;
//私有數據
void *private;
//hash表
dictth ht[2]
//rehash索引
//當rehash不再進行的時候,值為-1
int trehashidx;
}dict;
type屬性和private屬性針對不同類型的鍵值對,用來創建多態字典。
dictType結構保存了一些用于操作鍵值對的函數,redis會為用途不同的字典設置不同的函數。
private保存了傳給函數的 參數。
ht屬性保存了兩個hash表,通常情況下只使用一個hash表,另一個hash表用作復制。
- 1 回答
- 0 關注
- 696 瀏覽
添加回答
舉報