Redis-数据结构简介-Hash

 
  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,其中一个哈希表存储数据,另一个哈希表为空。
 
 

 

 
 
posted @ 2022-11-10 16:54  茄子777  阅读(113)  评论(0编辑  收藏  举报