Redis实现原理(2)--字典
2014-08-03 14:11
597 查看
1、 Dict
2.1 数据结构定义dict.h
2.2 hash
调用type中得hashFunction方法计算key的hash值,redis内部使用的hash算法为Austin Appleby开发的MurmurHash2算法
h = d->type->hashFunction(key)
计算key的索引值,先在ht[0]中查找,如果没有找到并且在rehash的过程中,则继续在ht[1]中找
idx = h & d->ht.sizemask
2.1 数据结构定义dict.h
// 哈希表结构 typedef struct dictht { dictEntry **table; //哈希表数组指针 unsigned long size; //哈希表大小 unsigned long sizemask; //掩码,hash时用到 unsigned long used; //已有节点的数量 } dictht; // 哈希表节点结构 typedef struct dictEntry { void *key; union { void *val; uint64_t u64; int64_t s64; } v; // 值,可以是指针类型、uint64和int64 struct dictEntry *next; //指向下一节点形成一个单链表 } dictEntry; //字典定义 typedef struct dict { dictType *type; void *privdata; dictht ht[2]; int rehashidx; // 重分布标示-1标示正在重分布中 int iterators; // 重分布进度 } dict; // 字典类型 // 每个dictType保存了一系列用于操作特定字典的函数,不同用途的字典type不同 typedef struct dictType { // hash函数 unsigned int (*hashFunction)(const void *key); // key的复制 void *(*keyDup)(void *privdata, const void *key); // value的复制 void *(*valDup)(void *privdata, const void *obj); // key的比较 int (*keyCompare)(void *privdata, const void *key1, const void *key2); // key的销毁 void (*keyDestructor)(void *privdata, void *key); // value的销毁 void (*valDestructor)(void *privdata, void *obj); } dictType;
2.2 hash
调用type中得hashFunction方法计算key的hash值,redis内部使用的hash算法为Austin Appleby开发的MurmurHash2算法
h = d->type->hashFunction(key)
计算key的索引值,先在ht[0]中查找,如果没有找到并且在rehash的过程中,则继续在ht[1]中找
idx = h & d->ht