Hash 结构存储值与结构读写能力: 包含键值对的无序散列表 添加,获取,移除单个键值对; 获取所有键值对. 存储类似HashMap的数据
hash是日常开发过程中使用的 Redis 的一个数据结构,其底层实现方式有量汇总,如下所示。一种是 zipList,这种是 hash 结构的 v 值较小的时候采用的编码方式。另一种方式是字典 dict,当 hash 结构的v 值较大时采用的编码方式。 dict 结构如下
typedf struct dict{ dictType *type;//类型特定函数,包括一些自定义函数,这些函数使得key和 //value能够存储 void *private;//私有数据 dictht ht[2];//两张hash表 int rehashidx;//rehash索引,字典没有进行rehash时,此值为-1 unsigned long iterators; //正在迭代的迭代器数量 }dict;
type 和 private 这两个属性是为了实现字典多态而设置的,当字典中存放着不同类型的值,对应的一些赋值,比较函数也不一样,这两个属性配合起来可以实现多态方法的调用; ht[2],两个 hash 表 rehashidx,这是一个辅助变量,用于记录 rehash 过程的进度,以及是否正在进行 rehash 等信息,当此值为 -1 时,表示该 dict 此时没有 rehash 过程 iterators,记录此时 dict 有几个迭代器正在进行遍历过程 dictht 由上面可以看出,dict 本质上是对哈希表 dictht 的一个简单封装,dictht 的定义如下所示:
typedf struct dictht{ dictEntry **table;//存储数据的数组 二维 unsigned long size;//数组的大小 unsigned long sizemask;//哈希表的大小的掩码,用于计算索引值,总是等于 //size-1 unsigned long used;//// 哈希表中中元素个数 }dictht;
**table 是一个 dicEntry 类型的数组,用于真正存储数据; size 表示 **table 这个数组的大小; sizemask 用于计算索引位置,且总是等于 size - 1; used 表示 dictht 中已有的节点数量,其示意图如下所示:
dictEntry 上面分析 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,其中一个哈希表存储数据,另一个哈希表为空。
标签:rehash,Hash,dictEntry,Redis,dict,哈希,hash,dictht,数据结构 From: https://www.cnblogs.com/qiezi777/p/16877657.html