redis中用dict 表示一个字典
typedef struct dict {
// 类似sds定义一组函数指针
dictType *type;
// 私有数据
void *privdata;
// 哈希表
dictht ht[2];
// 当没有进行rehash操作是值为-1
int rehashidx; /* rehashing not in progress if rehashidx == -1 */
// 迭代器的数量
int iterators; /* number of iterators currently running */
} dict;
这个dict中有两个重要的数据结构
其一是:
typedef struct dictType {
unsigned int (*hashFunction)(const void *key);
void *(*keyDup)(void *privdata, const void *key);
void *(*valDup)(void *privdata, const void *obj);
int (*keyCompare)(void *privdata, const void *key1, const void *key2);
void (*keyDestructor)(void *privdata, void *key);
void (*valDestructor)(void *privdata, void *obj);
} dictType;
这个dictType定义了六个函数指针,这些函数指针的意义都很明确
其二是:哈希表
typedef struct dictht {
// 哈希表数组
dictEntry **table;
unsigned long size;
// 总是等于 size - 1
unsigned long sizemask;
// 该哈希表已有节点的数量
unsigned long used;
} dictht;
其中的table 表示哈希表数组,其单个节点的数据类型定义如下:
typedef struct dictEntry {
// 键
void *key;
// 可以看出哈希表可以保存三类数据数据类型
union {
void *val;
uint64_t u64;
int64_t s64;
} v;
// 指向下个哈希表节点,形成链表
struct dictEntry *next;
} dictEntry;
调用dictCreate 可以新建一个字典,看来新建dict的时候必须制定六个函数指针和私有数据
dict *dictCreate(dictType *type,
void *privDataPtr)
{
#申请memory 并清零
dict *d = zmalloc(sizeof(*d));
_dictInit(d,type,privDataPtr);
return d;
}
int _dictInit(dict *d, dictType *type,
void *privDataPtr)
{
// 两个哈希表赋初值
_dictReset(&d->ht[0]);
_dictReset(&d->ht[1]);
// 成员变量根据形参赋初值或者默认值
d->type = type;
d->privdata = privDataPtr;
d->rehashidx = -1;
d->iterators = 0;
return DICT_OK;
}
//给两个哈希表赋初值
static void _dictReset(dictht *ht)
{
ht->table = NULL;
ht->size = 0;
ht->sizemask = 0;
ht->used = 0;
}
redis中的dict
最新推荐文章于 2024-04-23 23:00:39 发布