Redis数据结构之listpack和quicklist使用学习

 更新时间:2023年07月03日 17:25:01   作者:Hunter后端  
这篇文章主要为大家介绍了Redis数据结构之listpack和quicklist的使用学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Redis两种结构 listpack 和 quicklist

按照顺序,本来应该先介绍 quicklist 的结构,quicklist 在 7.0 之前的版本是由双向链表和压缩列表构成的,但是在 7.0 版本已经变成了由双向链表和 listpack 实现,所以在这里我们先介绍一下 listpack 的结构。

1、listpack

listpack 是替换 ziplist 的数据结构,所以在结构上两者是有些相似的,listpack 的结构如下:

| 总字节长度 | entry个数 | entry1 | entry2 | ... | entryN | end |

相比 ziplist,listpack 去除了到尾部节点,也就是到 entryN 的偏移量,但保留了其他属性。

对于单个 entry 元素,其结构如下:

| encoding | content | length |

encoding 表示 content 的编码,endocing 表示实际存储的内容,length 表示该 entry 的长度

避免连锁更新

使用 listpack 替代 ziplist 的一个好处是避免了连续更新的问题。

因为 ziplist 的每个元素都有一个属性用于保存前一个节点元素的长度,因此前一个节点修改后会可能需要修改后一个节点的属性,但是 listpack 没有这个关联关系,从而避免了影响后续元素的长度,也因此避免了连锁更新的问题。

获取最后一个节点

虽然 listpack 没有了指向尾部节点的偏移量,但是同样可以快速找到 listpack 的尾部节点,方式是通过 总字节长度属性的值,可以直接获取到 listpack 的尾部,然后根据 entry 元素尾部的 length 属性,就可以找到尾部 entry 的起始地址了。

2、 quicklist

在 Redis 3.2 版本,列表对象的底层实现变成了由 quicklist 实现,quicklist 实际上是压缩列表和双向链表的组合结构,因为 quicklist 就是一个链表,而链表中每一个元素就是压缩列表。

而在 Redis 7.0 版本,quicklst 变成了由双向链表和 listpack 构成的结构。

这里直接介绍 quicklist 由双向链表和 listpack 构成的结构。

quicklist 的结构和双向链表的结构类似:

typedef struct quicklist {
    quicklistNode *head;
    quicklistNode *tail;
    unsigned long count; 
    unsigned long len; 
    ...
} quicklist;

对于一个 quicklist,它也有指向 quicklist 的头节点和尾节点的指针,如结构中的 head 和 tail。

count 属性统计每个 quicklist 节点的 listpack 总数量的属性

len 则是统计 quicklist 中 quicklistNode 的数量的属性。

typedef struct quicklistNode {
    struct quicklistNode *prev;
    struct quicklistNode *next;
    unsigned char *entry;
    size_t sz;             
    unsigned int count : 16; 
    ...
} quicklistNode;

对于一个 quicklistNode,拥有指向前置节点和后置节点的指针,还有指向其下 listpack 的 entry,以及 sz 表示该 listpack 的总字节长度,count 属性则表示该 listpack 中包含的元素个数。

以上就是Redis数据结构之listpack和quicklist使用学习的详细内容,更多关于Redis数据结构listpack quicklist的资料请关注脚本之家其它相关文章!

相关文章

  • redis中的事务操作案例分析

    redis中的事务操作案例分析

    这篇文章主要介绍了redis中的事务操作案例,结合具体实例形式详细分析了redis事务操作的概念、原理、使用技巧与相关注意事项,需要的朋友可以参考下
    2019-07-07
  • redis实现简单分布式锁

    redis实现简单分布式锁

    这篇文章主要介绍了redis实现简单分布式锁,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2013-09-09
  • Redis 5.05 单独模式安装及配置方法

    Redis 5.05 单独模式安装及配置方法

    这篇文章主要介绍了Redis 5.05 单独模式安装,文中通过代码给大家介绍了Redis 5.0.5 单节点 安装配置方法,需要的朋友可以参考下
    2019-10-10
  • Redis HyperLogLog数据统计轻量级解决方案详解

    Redis HyperLogLog数据统计轻量级解决方案详解

    这篇文章主要为大家介绍了Redis HyperLogLog数据统计轻量级解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Redis中ZSet的具体使用

    Redis中ZSet的具体使用

    本文主要介绍了Redis中ZSet的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Redis恢复被移除集群的服务器实操步骤

    Redis恢复被移除集群的服务器实操步骤

    这篇文章主要为大家介绍了Redis恢复被移除集群的服务器实操步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Redis 单节点部署的实现

    Redis 单节点部署的实现

    本文主要介绍了Redis 单节点部署的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Redis序列化转换类型报错的解决

    Redis序列化转换类型报错的解决

    本文主要介绍了Redis序列化转换类型报错的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Redis在Ubuntu系统上无法启动的问题排查

    Redis在Ubuntu系统上无法启动的问题排查

    这篇文章主要介绍了Redis在Ubuntu系统上无法启动的问题排查,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-08-08
  • 分布式锁三种实现方式及对比

    分布式锁三种实现方式及对比

    这篇文章主要介绍了分布式锁三种实现方式及对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论