1. 引言
字典(Dict)是Redis的核心数据结构之一,用于实现键值存储(Redis数据库的核心)和内部元数据管理(如客户端状态)。Redis的字典基于哈希表实现,支持高效的增删改查操作。本篇将深入剖析其源码实现,包括哈希表结构、冲突解决和渐进式rehash机制。
2. 字典的结构体定义
字典的定义在src/dict.h
和src/dict.c
中。以下是核心结构:
代码片段(dict.h
):
typedef struct dictEntry {
void *key; // 键
union {
void *val; // 值
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next; // 链表,解决哈希冲突
} dictEntry;
typedef struct dictht {
dictEntry **table; // 哈希表数组
unsigned long size; // 哈希表大小
unsigned long sizemask; // 大小掩码,用于计算索引
unsigned long used; // 已使用槽数
} dictht;
typedef struct dict {
dictType *type; // 类型特定函数(如自定义哈希)
void *privdata; // 私有数据
dictht ht[2]; // 两个哈希表,用于rehash
long rehashidx; // rehash进度,-1表示未进行
} dict;
硬核解析:
dictEntry
:键值对节点,next
指针形成链表解决冲突。dictht
:哈希表,size
是2的幂次,sizemask = size - 1
。dict
:包含两个哈希表ht[0]
和ht[1]
,支持渐进式rehash。
Mermaid结构图: