存储类型_HFL Redis_09_hash类型底层存储数据结构

HotFrameLearning(简称 HFL) Redis_09_hash类型底层存储数据结构

-

一、大致介绍

```

1、上一篇讲解了list的底层数据结构,这节我们继续讲hash数据结构;

2、接下来我就通过参考 redis-6.0.6 源码给大家介绍下hash的底层数据结构吧;

```

二、hash数据结构

2.1 源码详解(hsetCommand)

f527d1b7738d1151b89dc80950a842c1.png

图1 - hsetCommand方法

62ff98b747813e4e757583966e844423.png

图2 - hashTypeLookupWriteOrCreate方法

f42b254b9c5d9c023e4d071c18675177.png

图3 - hashTypeSet方法

```

1、图1中,我们可以看到一个 HSET 命令大体执行流程,先是看看 hash 数据结构是否存在,然后循环将入参的数据放进 hash 数据结构中,最后做出响应处理;

2、图2中,我们看到首先检查key是否存在于db中,若存在的话这里不是我们要探究的点;若不存在的话,则会直接创建一个 hashObject 对象,createHashObject() 方法中直接调用 ziplistNew() 构建了一个 ziplist 对象,并且将类型 type 设置为 OBJ_HASH 类型,将 encoding 设置为 OBJ_ENCODING_ZIPLIST 编码;

3、图3中,前半段主要针对 OBJ_ENCODING_ZIPLIST 编码类型的数据结构做处理,后半段主要针对 OBJ_ENCODING_HT 编码类型的数据结构做处理,由此可见,hash 对象的底层也有两种数据结构:hashTable 与 ziplist 两种;

```

2.2 涉及到的数据结构体

03f7ce4c89c58d6ca0e3053ded930139.png

图4 - zlentry结构体

abcdf00c1e5695210fdd837f3cb6d270.png

图5 - dictEntry结构体

```

1、说道列举数据,大家肯定会想,ziplist 的数据结构去哪里了,因为源码里面没有给出明确定义,但是从【reqlen += zipStorePrevEntryLength(NULL,prevlen); 和 ziplistResize(zl,curlen+reqlen+nextdiff); 和 zl[len-1] = ZIP_END;】这段代码可以推测,hash数据结构中的 ziplist 是靠着特殊结尾+设置前后数据结构的偏移量来添加 zlentry 的;

2、zlentry 数据结构:

  • unsigned int prevrawlensize; /*前一个元素需要的空间*/
  • unsigned int prevrawlen; /*前一个元素需要的长度*/
  • unsigned int lensize; /*元素需要的空间*/
  • unsigned int len; /*元素需要的长度*/
  • unsigned int headersize; /*头部长度即prevrawlensize + lensize*/
  • unsigned char encoding; /*元素内容编码*/
  • unsigned char *p; /*元素实际内容*/

3、dictEntry 数据结构,和我们Java的HashMap结构一样,冲突的话就用链表 *next 来处理;

```

欢迎关注+点赞,您的肯定是对我最大的支持!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值