Redis的字典使用哈希表作为底层实现,一个哈希表里面有n个哈希节点,每个节点里面存储着key-value键值对
1、哈希表
哈希表数据结构,下图:
一个空的哈希表,如下图:
2、哈希表节点
数据结构,如下:
3、哈希表总结构
当多个key的hash值相同的时候,哈希表采用链式方式来解决冲突,每个哈希表节点都有一个next指针,指向下一个key的hash值相同的节点,这样,hask值相同的哈希表节点就构成了一个单向链表
4、字典
4.1、数据结构
字典中包含2个哈希表,一般情况下只使用ht[0]哈希表,ht[1]只会在对ht[0]做rehash的时候使用
4.2、字典的结构
5、rehash
当ht[0]随着操作的不断进行,为了让哈希表维持在一个合理的范围,会对哈希表做相应的扩展或收缩操作
5.1、扩展
ht[1].size = ht[0].used*2的n次方
5.2、收缩
ht[1].size = 第一个大于等于ht[0].used的2的n次方
将保存在htp[0]的键值对全部rehash到ht[1],然后清空ht[0],将ht[1]设置成ht[0],在新的ht[1]上创建一个新的哈希表,待下一次rehash使用
当然rehash是渐进式的,分多次完成