码迷,mamicode.com
首页 > 其他好文 > 详细

Redis底层数据结构之hash

时间:2020-07-22 20:04:21      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:自己   size   字典   数据结构   loading   html   简单   节点   hid   

hash是日常开发过程中使用Redis的一个数据结构,其底层实现方式有两种,如下所示。一种是zipList,这种是当hash结构的V值较小的时候使用的编码方式。这个已经在上一篇文章中介绍过了。这篇文章主要讲解一下另外一种实现方式,字典dict,当hash结构的V值较大时采用的编码方式。

dict

这里又要开始鞭尸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;
  • typeprivate这两个属性是为了实现字典多态而设置的,当字典中存放着不同类型的值,对应的一些复制,比较函数也不一样,这两个属性配合起来可以实现多态的方法调用;
  • ht[2],两个hash
  • trehashidx,这是一个辅助变量,用于记录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是一个dictEntry类型的数组,用于真正存储数据;size表示**table这个数组的大小;sizemask用于计算索引位置,且总是等于size-1used表示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,其中一个哈希表存储数据,另一个哈希表为空。

Redis底层数据结构之hash

标签:自己   size   字典   数据结构   loading   html   简单   节点   hid   

原文地址:https://www.cnblogs.com/reecelin/p/13362104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!