今天要介绍的数据结构,是Redis中的哈希表,这种数据结构是Redis中非常重要的一种数据类型,可以方便的处理很多复杂场景的业务需求。
哈希表 的结构定义在 dict.h 文件中,我们抽取代码查看一下:
如图所示, 哈希表是一个结构体类型,包含四个成员属性:
- table 是一个数组,数组的每个元素都是一个指向 dict.h/dictEntry 结构的指针;
- size 记录哈希表的大小,即 table 数组的大小,且一定是2的幂;
- used 记录哈希表中已有结点的数量;
- sizemask 用于对哈希过的键进行映射,索引到 table 的下标中,且值永远等于 size-1。具体映射方法很简单,就是对 哈希值 和 sizemask 进行位与操作,由于 size 一定是2的幂,所以 sizemask=size-1,自然它的二进制表示的每一个位(bit)都是1,等同于取模;
由上图我们已经知道,哈希表的定义中包含一个table数组,它的每一个元素都是一个指向dictEntry结构类型的指针,其实这里的dictEntry便是哈希表的节点。
哈希表节点 的结构定义在 dict.h 文件中的较前位置,我们查看一下代码:
由上图可知每一个dictEntry结构都是一个健值对,且有一个next指针,来维持节点之间的链表形态。下面我们详细看下每个字段的具体含义:
- key 是键值对中的键;
- v 是键值对中的值,它是一个联合类型,方便存储各种结构;
- next 是链表指针,指向下一个哈希表节点,他将多个哈希值相同的键值对串联在一起