ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis数据结构之list对象

2019-07-17 16:03:04  阅读:234  来源: 互联网

标签:编码 list ziplist Redis 链表 数据结构 压缩 quicklist


Redis数据结构之list对象

List 对象

一个list对象,可以看到它是quicklist编码。

127.0.0.1:6379> rpush list 1 "hello" 2 3
(integer) 4
127.0.0.1:6379> type list
list
127.0.0.1:6379> object encoding list
"quicklist"

新版本的redis的list对象都是使用quicklit编码。为了更好的理解quicklit编码,我们先介绍quicklit编码的前身,ziplist和linklist。

ziplist和linklist都已经被quicklit所取代,这里只是为了更好的理解quicklit才列出ziplist和linklist两种编码

ziplist编码

顾名思义,压缩链表,为了节约内存空间而设计。

一个压缩链表的结构

在这里插入图片描述
·若列表zlbytes属性的值为0x50(十进制80),表示压缩列表的总长为80字节。
·若列表zltail属性的值为0x3c(十进制60),这表示如果我们有一个指向压缩列表起始地址的指针p,那么只要用指针p加上偏移量60,就可以计算出表尾节点entry3的地址。
·若列表zllen属性的值为0x3(十进制3),表示压缩列表包含三个节点。

压缩链表的每一个节点,也就是上图的entry1,entry2结构如下

在这里插入图片描述
节点的previous_entry_length属性以字节为单位,记录了压缩列表中前一个节点的长度,也就是说当我们获取到一个指向当前节点的指针p时,么只要用指针p减去偏移量previous_entry_length就可以获得上一个节点,通过zltail属性又可快速获取最后一个节点。压缩链表通过这种方式实现从表尾向表头遍历链表。
压缩链表开辟了一块连续的空间实现了链表结构,极大的提高的内存的利用率,缺点是需要经常要重新分配内存。

ziplist编码的list对象的结构,ptr指向一个压缩链表

在这里插入图片描述

linkedlist编码

linkedlist的编码的list对象则是普通的链表结构指向相应的存储对象,图中是指向string对象。

在这里插入图片描述
优点是插入新增不需要重新分配内寸,缺点内存使用效率较低。

quicklist编码

了解了ziplist和linkedlist之后就很容易理解quicklist的结构了

quicklist就是每个linkedlist节点都存储一个ziplist对象,每个ziplist为8kb,超过8kb则新建一个节点

在这里插入图片描述
这样就极大的降低了内存的碎片化程度,又降低了内存重新分配的规模。

实际使用的时候,quicklist在不断的新增元素时,第一个quicklistNode和最后一个quicklistNode指向的ziplist始终保持不压缩的状态,而中间的ziplist会被再次压缩(执行LZF算法)。不被压缩的ziplist数量是由redis.conf中的list-compress-depth决定的,默认是一,也就是第一个和最后一个不被压缩,当ziplist满了需要新建一个quicklistNode时它的空间限制是8kb,由list-max-ziplist-size决定。

我们可以用rpush,lpush,rpop,lpop等命令操作quicklist。

标签:编码,list,ziplist,Redis,链表,数据结构,压缩,quicklist
来源: https://blog.csdn.net/weixin_41055458/article/details/96316832

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有