字典哈希表的实现原理_Redis哈希表的设计与实现

本文深入探讨Redis中的哈希表结构,包括哈希表的定义、节点结构、解决哈希冲突的方法(分离链接法)以及字典的渐进式rehash策略。哈希表在Redis中用于高效处理键值对,支持复杂业务场景。
摘要由CSDN通过智能技术生成

今天要介绍的数据结构,是Redis中的哈希表,这种数据结构是Redis中非常重要的一种数据类型,可以方便的处理很多复杂场景的业务需求。

哈希表 的结构定义在 dict.h 文件中,我们抽取代码查看一下:

44094acd5765828e15439856de916ffd.png

如图所示, 哈希表是一个结构体类型,包含四个成员属性:

  • 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 文件中的较前位置,我们查看一下代码:

4b756bd23749abefd5a9a1065d88661c.png

由上图可知每一个dictEntry结构都是一个健值对,且有一个next指针,来维持节点之间的链表形态。下面我们详细看下每个字段的具体含义:

  • key 是键值对中的键;
  • v 是键值对中的值,它是一个联合类型,方便存储各种结构;
  • next 是链表指针,指向下一个哈希表节点,他将多个哈希值相同的键值对串联在一起
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值