HFL Redis_11_zset类型底层存储数据结构

HotFrameLearning(简称 HFL) Redis_11_zset类型底层存储数据结构
-
一、大致介绍
```
1、上一篇讲解了 set 的底层数据结构 , 趁热我们赶紧接下来看看 zset 数据类型吧;
2、接下来我就通过参考 redis-6.0.6 源码给大家介绍下zset的底层数据结构吧;
```
二、zset数据结构
2.1 源码详解(zaddGenericCommand)
HFL Redis_11_zset类型底层存储数据结构文章插图
图1 - zaddGenericCommand方法
HFL Redis_11_zset类型底层存储数据结构文章插图
图2 - createZsetObject/createZsetZiplistObject 方法
HFL Redis_11_zset类型底层存储数据结构文章插图
【HFL Redis_11_zset类型底层存储数据结构】图3 - zsetAdd方法
1、图1中 , 我们可以看到一个 ZADD 命令大体执行流程 , 先是看看 zset 数据结构是否存在 , 不存在的话则构建出新对象(skiplist 或 ziplist)进行添加入参 , 存在的话则通过循环将入参的数据放进 zset 数据结构中 , 最后做出响应处理;至于这个新对象的创建 , 则是根据有序集合设置了不使用ziplist存储 , 或者第一个插入元素的长度大于设置的最大ziplist的元素长度值 , 则使用skiplist存储 , 否则使用ziplist
2、图2中 , 我们可以清楚的看到 skiplist、ziplist 的创建过程;
3、图3中 , 前半段主要针对 OBJ_ENCODING_ZIPLIST 编码类型的数据结构做处理 , 后半段主要针对 OBJ_ENCODING_SKIPLIST 编码类型的数据结构做处理 , 由此可见 , set 类型的底层也有两种数据结构:skiplist 与 ziplist 两种;
```
2.2 涉及到的数据结构体
HFL Redis_11_zset类型底层存储数据结构文章插图
图4 - skiplist结构体
```
1、图4中 , 想必大家没看到 ziplist 结构体吧 , 因为不想重复拷贝图片 , 大家还是去上上篇《hash类型底层存储数据结构》去了解下ziplist吧;
2、至于说 skiplist , 大家从这结构一看 , 和我们Java中的 skiplist 玩法一毛一样 , 然后举个 skiplist 的样例图如下:
HFL Redis_11_zset类型底层存储数据结构文章插图
图5 - skiplist 样例数据结构
```
欢迎关注+点赞 , 您的肯定是对我最大的支持!!!