Dict
Dict是redis中实现的一种字典数据结构, 并且也是作为redis整个设计体系中的基石
dictEntry
dictEntry
是字典中的节点
typedef struct dictEntry {
void *key;
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next;
} dictEntry;
- dictEntry的成员特性如下
- key是void*类型, 代表其可以指向任意类型, 依靠这一点dict便可以实现键的伪泛型
- v是共用体, 不论是val,u64,s64,d都是8字节大小, 同时由于val是void*, 代表其可以指向任意类型, 依靠这一点可以实现值的伪泛型
- next是指向下一节点的指针, redis的dict对于冲突的哈希键采取的是开放链表法
dictType
dictType
是redis中用来实现泛型字典的一种关键数据结构, 其定义了特定类型字典的键、值释放函数(keyDestructor valDestructor)、复制函数(keyDup valDup),以及键的比较函数(keyCompare)
typedef struct dictType {
uint64_t (*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;
dictht
dictht
是字典中的哈希表,
typedef struct dictht {
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
} dictht;
- table, table是一个数组, 用来存放节点的指针, 元素类型为
dictEntry*
- size, 哈希表大小
- sizemask, 哈希表大小的掩码, 该数据字段主要用于计算索引其值 = size -1
- used, 由于redis的dict维护两个table, 一个table用于存放数据, 另一个用于作rehash操作, 所以需要有一个字段标识真正使用的是哪个table
dict
struct dict
是redis中的字典实现, 其中维护了一个字典所需要的元数据
typedef struct dict {
dictType *type;
void *privdata;
dictht ht[2];
long rehashidx;
unsigned long iterators;
} dict;
- type, 用于存储字典的泛型处理函数
- privdata, 用于存放私有数据
- ht[2], 每个字典都有两个
dictht
成员以便做rehash的时候使用. 主要是为了避免字典数据过多时, 由于哈希冲突影响性能 - rehashidx rehash
- iterators, 当前字典迭代器的个数
dictIterator
typedef struct dictIterator {
dict *d;
long index;
int table, safe;
dictEntry *entry, *nextEntry;
long long fingerprint;
} dictIterator;
typedef void (dictScanFunction)(void *privdata, const dictEntry *de);
typedef void (dictScanBucketFunction)(void *privdata, dictEntry **bucketref);
#define DICT_HT_INITIAL_SIZE 4