HotFrameLearning(简称 HFL) Redis_09_hash类型底层存储数据结构
-
一、大致介绍
```
1、上一篇讲解了list的底层数据结构,这节我们继续讲hash数据结构;
2、接下来我就通过参考 redis-6.0.6 源码给大家介绍下hash的底层数据结构吧;
```
二、hash数据结构
2.1 源码详解(hsetCommand)
```
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 涉及到的数据结构体
```
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 来处理;
```
欢迎关注+点赞,您的肯定是对我最大的支持!!!