首页 > 数据库 >Redis数据结构简介-Hash

Redis数据结构简介-Hash

时间:2022-11-10 17:01:07浏览次数:44  
标签:rehash Hash dictEntry Redis dict 哈希 hash dictht 数据结构

    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

相关文章

  • Redis数据结构简介-List
     List结构存储值与结构读写能力:一个链表,链表上的每个节点都包含了一个字符串从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单......
  • Redis 中 hash 扩容与缩容
    Redis中hash扩容与缩容当哈希表中元素数量逐渐增加时,此时产生hash冲突的概率逐渐增大,且由于dict也是采用拉链法解决hash冲突的,随着hash冲突概率上升,链表会越来越......
  • SpringBoot整合Redis(十九)
    二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。上一章简单介绍了多数据源配置MyBatisPlus(十八),如果没有看过,​​请观看上一章​​一.Redis的介绍和安装......
  • Redis模糊匹配删除key
    在群里看到的一个Redis快速删除数据小技巧。之前我一直用scan出来再删方式,比较慢,不如本文下面这个方法。造些测试数据foriin{1..1000};doecho"setage_$i$i"|re......
  • SpringBoot整合Redis_Jedis版(二十)
    二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。上一章简单介绍了SpringBoot整合Redis(十九),如果没有看过,​​请观看上一章​​SpringBoot2.0版本之后,采......
  • Redis对于字符串(String)知识点理解和实操过程例子的详解记录
    一.Redis字符串1.1基本操作如果字符串内容为整数的时候。1.1.1set、mset、get、mget存和取Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味......
  • Redis知识点
    Redis是一个基于内存的高性能key-value数据库Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘,所以Redis具有快速和数据持久化的特征,如果数......
  • 数据结构:线性表
    线性表分类区别​顺序表一般是使用数组存储的,存储空间是连续的;​链式表一般是使用指针,将一个个结点联系起来。结点有数据域和指针域,数据域用来存储数据,指针域用......
  • Get MD5 Hash of Big Files
    RecentlyIhavebeendealingwithfilesandIneedtogetmd5hashofallkindsoffiles;Somearesmallandsomearebig.ForthesmallfilesIusethismethod......
  • 从0到1搭建redis6.0.7续更~
    “心有所向,日复一日,必有精进”前言:想必大家看完我之前写的搭建redis服务器,大家都已经把redis搭建起来了吧如果没有搭建起来的小可爱请移步这里哦从0到1搭建redis6是不是......