数据类型-Hashtable
dictEntry
//24字节
typedef struct dictEntry {
void *key;
union {
void *val;
uint64_t u64;
int64_t s64;
} v;
struct dictEntry *next; // 指向下个哈希表节点,形成链表
} dictEntry;dict 哈希表
// 哈希表
// 每个字典都使用两个哈希表子结构,以实现渐进式 rehash 。
typedef struct dict {
dictType *type; // 类型特定函数
void *privdata; // 私有数据
dictht ht[2]; // ht=hash table,每个dict有俩,增量扩容时使用
// 搬迁进度
// 因为是渐进式的哈希,数据的迁移并不是一步完成的,所以需要有一个索引来标记当前的搬迁进度
// rehash 是 以bucket(桶)为基本单位进行渐进式的数据迁移的,每步完成一个 bucket 的迁移,直至所有数据迁移完毕
long rehashidx; // 扩容时的迁移进度。不迁移时为-1
int16_t pauserehash; // 标记是否暂停扩容。持久化时需要暂停扩容
} dict;
// 哈希表子结构
typedef struct dictht {
// 哈希表数组
// 可以看作是:一个哈希表数组,数组的每个项是entry链表的头结点(链地址法解决哈希冲突)
dictEntry **table;
// 哈希表大小
unsigned long size;
// 哈希表大小掩码,用于计算索引值。其值即为 size - 1
unsigned long sizemask;
// 该哈希表已有节点的数量
unsigned long used;
} dictht;
字段初始化
哈希表渐进式 rehash 的详细步骤
触发条件
触发时机
渐进式 rehash 执行期间的哈希表操作
好处
问题
Last updated