一,哈希表节点
哈希表节点使用dictEntry结构表示,每个dictEntry结构都保存一个键值对。
typedef struct dictEntry{
//键
void *key;
//值
union{
void *val;
uint64_t u64;
int64_t s64;
} v;
//指向下一个哈希表节点,形成链表
struct dictEntry *next;
}
二,哈希表
Redis的字典所使用的哈希表由dictht结构定义:
typedef struct dictht{
//哈西表数组
dictEntry **tables;
//哈希表大小
unsigned long size;
//哈希表大小掩码,用来计算索引值,总是等于size-1
unsigned long sizemask;
//哈希表已经有的节点数量
unsigned long used;
}
table是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存者一个键值对。
size记录了哈希表的大小,即table数组的大小
used记录了哈希表目前已经有的节点(键值对)的数量
sizemask和哈希值决定一个键应该被放到table数组的哪个索引上(索引值 = hash值 / sizemask)
三,字典
Redis字典使用的哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个哈希表节点保存一个键值对。
Redis中的字典由dict结构表示:
typedef struct dict{
//特定类型函数
dictType *type;
//私有数据
void *privdata;
//哈希表
dictht ht[2];
//rehash索引,当rehash不在进行时,值为-1
int trehashidx;
}
type是一个指向dictType结构的指针,每个dictType结构保存了一些用于操作特定类型键值对的函数,Redis会为不同用途的字典设置不同类型的函数
privdata保存了特定类型函数的参数
type属性和privdata属性时针对不同类型的键值对,为创建多态字典而设置的
typedef struct dictType{
//计算哈希值的函数
unsigned int (*hashFunction)(const viod *key)
//复制键的函数
//复制值的函数
//销毁键的函数
//销毁值的函数
}