《Redis设计与实现》_第四章_字典的实现

Redis的字典基于哈希表实现,哈希表由dict.h/dictht结构定义,包含table数组、size、used和sizemask等属性。哈希表节点dictEntry保存键值对,next指针处理键冲突。字典结构dict包含type和privdata,提供多态操作,并通过ht数组进行rehash。本文深入探讨了Redis字典的内部机制。
摘要由CSDN通过智能技术生成

Redis的字典用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个哈希表节点保存了字典中的一个键值对。
顺序:哈希表——哈希表节点——字典的实现。
哈希表
Redis字典使用的哈希表由dict.h/dictht结构定义:

typedef struct dictht
{
	dictEntry **table;//哈希表数组
	unsigned long size;//哈希表大小
	unsigned long sizemask;//哈希表大小掩码,用于计算索引值,总是等于size-1
	unsigned long used;//哈希表已有的节点数量
}dictht;

table是一个数组,数组中每个元素都是一个指向dict.h/dictEntry结构的指针,每个dictEntry结构保存着一个键值对。
size记录哈希表的大小,也即是table数组的大小。
used记录哈希表目前已有的节点数量。
sizemask总是等于size-1,这个属性和哈希值一起决定了一个键应该被放到table数组的哪个索引上面。
下面列举一个空哈希表
在这里插入图片描述
哈希表节点
每个dictEntry结构都保存着一个键值对

typedef struct dictEntry
{
	void *key;//键
	union//值
	{
		void *val;
		uint64_tu64;
		int64_ts64;
	}v;
	struct dictEntry *next;//指向下一个哈希节点,形成链表。
}dictEntry;

键值对中的值可以是一个指针,或者是一个uint_64整数,又或者是一个int64_t整数。
next指针可以将多个哈希值相同的键值对连接在一起,以此来解决键冲突(collision)的问题。
示例:通过next指针,将两个索引值相同的键k1和k0连接在一起。
在这里插入图片描述
k1和k0都是索引值为2的键,所以它们都被连接在了table数组中索引为2的后边,k1和k0两个节点再通过next指针实现连接在一起。
字典
Redis中的字典由dict.h/dict结构表示

typedef struct dict
{
	dictType *type;//类型特定函数
	void *privdata;//私有数据
	dictht ht[2];//哈希表
	in trehashidx;//rehash 索引,当rehash不在进行时,值为-1
}dict;

type和privdata是针对不同类型的键值对,为创建多态字典而设置的。
type是一个指向dictType结构的指针,每个dictType结构保存了一簇用于操作特定类型键值对的函数,Redis会为用途不同的字典设置不同的类型特定函数。
privdata保存了需要传给那些类型特定函数的可选参数。
dictType结构示例
在这里插入图片描述
ht是一个包含了两个项的数组,数组中每个项都是一个dictht哈希表,一般情况下字典只使用ht[0]哈希表,ht[1]哈希表只会在对ht[0]哈希表进行rehash时使用。
除了ht[1]外,另一个和rehash相关的就是rehashidx,它记录了rehash当前的进度,若当前没有进行rehash,则值为-1。
在这里插入图片描述
小结
这一章节写的一知半解,有好几个地方都不明白,接下来会写一下字典的基本定义和基础算法,以及哈希表的基本定义和基础结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值