发财哥的博客

1 2 3 4

Redis压缩列表原理与应用分析

Redis压缩列表原理与应用分析

摘要

Redis是一款著名的key-value内存数据库软件,同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型,同时每种数据结构类型针对不同的应用场景又支持不同的编码方式。这篇文章主要介绍压缩列表编码,在理解压缩列表编码原理的基础上介绍Redis对压缩列表的应用,最后再对Redis压缩列表应用进行分析。Redis压缩列表原理与应用

压缩列表是一种数据结构,这种数据结构的功能是将一系列数据与其编码信息存储在一块连续的内存区域,这块内存物理上是连续的,逻辑上被分为多个组成部分,其目的是在一定可控的时间复杂读条件下尽可能的减少不必要的内存开销,从而达到节省内存的效果,这么介绍有点玄乎,我们先一起看看它的实现原理吧,Redis3.2版本中,作者对压缩列表的实现在ziplist.h和ziplist.c中。压缩列表原理

我认为将数据按照一定规则存储在内存中可以用“编码”这个词描述,因此下面会常用“编码”这个词。总体编码

上面说到压缩列表是一块连续的内存区域,这块内存区域布编码示意图大致如下:

Redis压缩列表原理与应用分析

Redis压缩列表内存编码示意图

常态的压缩列表内存编码如上图所示,整个内存块区域内分为五个部分,下面分别介绍着五个部分:

zlbytes:存储一个无符号整数,固定四个字节长度,用于存储压缩列表所占用的字节,当重新分配内存的时候使用,不需要遍历整个列表来计算内存大小。

zltail:存储一个无符号整数,固定四个字节长度,代表指向列表尾部的偏移量,偏移量是指压缩列表的起始位置到指定列表节点的起始位置的距离。

zllen:压缩列表包含的节点个数,固定两个字节长度,源码中指出当节点个数大于2^16-2个数的时候,该值将无效,此时需要遍历列表来计算列表节点的个数。

entryX:列表节点区域,长度不定,由列表节点紧挨着组成。

zlend:一字节长度固定值为255,用于表示列表结束。列表元素编码

上面介绍了压缩列表的总体内存布局,对于初entryX区域以外的四个区域的长度都是固定的,下面再看看entryX区域的编码情况。

每个列表节点由三部分组成:

Redis压缩列表原理与应用分析

压缩列表节点编码示意图

上一篇:萌猫捉小鸡WooHoo鸡潮玩音箱 航拍网看评测
下一篇:能吃鸡还能做设计?GTX1650电竞屏麦本本黑麦7值得买