标签:自己 size 字典 数据结构 loading html 简单 节点 hid
hash
是日常开发过程中使用Redis
的一个数据结构,其底层实现方式有两种,如下所示。一种是zipList
,这种是当hash
结构的V
值较小的时候使用的编码方式。这个已经在上一篇文章中介绍过了。这篇文章主要讲解一下另外一种实现方式,字典dict
,当hash
结构的V
值较大时采用的编码方式。
这里又要开始鞭尸C
语言了,字典dict
作为一种常用的数据结构,C
语言内部并不具备,因而Redis
的开发人员自己设计和开发了Redis
中的dict
结构,其定义如下:
typedf struct dict{
dictType *type;//类型特定函数,包括一些自定义函数,这些函数使得key和
//value能够存储
void *private;//私有数据
dictht ht[2];//两张hash表
int trehashidx;//rehash索引,字典没有进行rehash时,此值为-1
unsigned long iterators; //正在迭代的迭代器数量
}dict;
type
和private
这两个属性是为了实现字典多态而设置的,当字典中存放着不同类型的值,对应的一些复制,比较函数也不一样,这两个属性配合起来可以实现多态的方法调用;ht[2]
,两个hash
表trehashidx
,这是一个辅助变量,用于记录rehash
过程的进度,以及是否正在进行rehash
等信息,当此值为-1时,表示该dict
此时没有rehash
过程iterators
,记录此时dict
有几个迭代器正在进行遍历过程由上面可以看出,dict
本质上是对哈希表dictht
的一个简单封装,dictht
的定义如下所示:
typedf struct dictht{
dictEntry **table;//存储数据的数组 二维
unsigned long size;//数组的大小
unsigned long sizemask;//哈希表的大小的掩码,用于计算索引值,总是等于
//size-1
unsigned long used;//// 哈希表中中元素个数
}dictht;
**table
是一个dictEntry
类型的数组,用于真正存储数据;size
表示**table
这个数组的大小;sizemask
用于计算索引位置,且总是等于size-1
;used
表示dictht
中已有的节点数量,其示意图如下所示:
上面分析dictht
时说到,真正存储数据的结构是dictEntry
数组,其结构定义如下:
typedf struct dictEntry{
void *key;//键
union{
void val;
unit64_t u64;
int64_t s64;
double d;
}v;//值
struct dictEntry *next;//指向下一个节点的指针
}dictEntry;
其示意图如下所示:
最后整个dict
的结构示意图如下所示:
上图是一个没有处于rehash
状态下的字典dict
,整个dict
中有两个哈希表dictht
,其中一个哈希表存储数据,另一个哈希表为空。
标签:自己 size 字典 数据结构 loading html 简单 节点 hid
原文地址:https://www.cnblogs.com/reecelin/p/13362104.html