一、字典的实现
Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。
1.1 哈希表
Redis字典所使用的哈希表由dict.h/dictht结构定义:
table属性是一个数组,数组中的每个元素都是一个指向dict.h/dictEntry结构的指针,每个dictEntry结构保存着一个键值对。size属性记录了哈希表的大小,也即是table数组的大小,而used属性则记录了哈希表目前已有节点(键值对)的数量。sizemask属性的值总是等于size-1,这个属性和哈希值一起决定一个键应该被放到table数组的哪个索引上面。
下图展示了一个大小为4的空哈希表:
1.2 哈希表节点
哈希表节点使用dictEntry结构表示,每个dictEntry结构都保存着一个键值对:
下图展示了如何通过next指针,将两个索引值相同的k1和k0连接在一起:
1.3 字典
Redis中的字典由dict.h/dict结构表示:
下图展示了一个普通状态下(没有进行rehash)的字典:
二、哈希算法
三、解决键冲突
四、rehash
举个例子,假如程序要对下图所示的字典h[0]进行扩展操作,那么程序将执行以下步骤: