链表
Redis中的链表为自定义数据结构,主要是C语言中没有定义这样的数据结构,不像Java,python都给你定义好了。其设计上为双向链表,跟其他算法书上的定义一样,并没有加入任何多余的东西。下面简单说明一下链表和链表节点。
链表,链表节点
链表节点:
listNode {
listNode *prev;
listNode *next
void *value;
}
多个链表节点组成双向链表:
链表:
list {
listNode *head;
listNode *tail;
unsinged long len
-------
-------
}
字典
还是由于C语言中并没有定义这样的数据结构,所以Redis只能自己定义一套。C语言老是要自己造轮子,也不知道是没有这样的库,还是写C的都贼牛。言归正传,Redis 自定义的字典,数据结构的核心还是跟算法书上的一样,不过加入了一些自定义的东西。
字典底层是用哈希表实现的,哈希表由哈希节点组成。我们按哈希节点,哈希表倒过来说
哈希节点
dictEntry{
dictEntry *next;
void *key;
union v;
}
可以看见,这就是一个键值对,同时包含指向下一个哈希节点的指针。指针用来解决哈希冲突(新的键值对要加入已经有元素的的索引处)用的,当出现哈希冲突后,多个节点就通过next这个指针形成单向链表
哈希表
dictht{
//哈希表数组
dictEntry **table;
unsigned long size;
//哈希表大小掩码,计算索引用
unsigned long sizemask;
unsigned long used;
}
哈希表就是由多个这样的单向链表组成的数组
字典
dict{
dictht ht[2];
int trehashidx;
dictType *type;
void *privdata;
}
- ht ,包含两个哈希表h[0],h[1],h[1]用于rehash时使用
- trehashidx,rehash进度
- type,一簇操作键值对的函数
- privdata,函数的可选参数
Redis 使用MumurHash2算法来计算键的哈希值,再通过哈希值与dictht.sizemask(dictht.size-1)进行与运算得出所以值