Redis数据结构之list对象
Redis数据结构之list对象
- List 对象
- ziplist编码
- linkedlist编码
- quicklist编码
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。
Redis数据结构之list对象相关推荐
- 「Redis数据结构」集合对象(Set)
「Redis数据结构」集合对象(Set) 文章目录 「Redis数据结构」集合对象(Set) 一.概述 二.结构 三.编码转换 四.小结 一.概述 Set是Redis中的单列集合,其特点为不保证有序性 ...
- 「Redis数据结构」字符串对象(String)
「Redis数据结构」字符串对象String 文章目录 「Redis数据结构」字符串对象String 一.概述 二.编码分类 int embstr row 三.小结 四.参考 一.概述 字符串数据类型 ...
- Redis数据结构-对象
目录 前言 1.对象的类型与编码 1.1.类型 2.编码和底层实现 2.1.字符串对象 2.2.列表对象 2.3.哈希对象 2.4.集合对象 2.5.有序集合对象 参考 最后 前言 Redis并没有直 ...
- 【Redis-09】面试题之Redis数据结构与对象-RedisObject(下篇)
承接上篇[Redis-08]面试题之Redis数据结构与对象-RedisObject(上篇) 8. type-字符串string 8.1 字符串的三种encoding编码(int + embstr ...
- 「Redis数据结构」哈希对象(Hash)
「Redis数据结构」哈希对象(Hash) 文章目录 「Redis数据结构」哈希对象(Hash) 一.概述 二.编码 ZipList HashTable 三.编码转换 一.概述 Redis中hash对 ...
- Redis 数据结构-字典源码分析
2019独角兽企业重金招聘Python工程师标准>>> 相关文章 Redis 初探-安装与使用 Redis 数据结构-字符串源码分析 本文将从以下几个方面介绍 前言 字典结构图 字典 ...
- 为了拿捏 Redis 数据结构,我画了 40 张图
Redis 为什么那么快? 除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理. 因此,这次我们就来好 ...
- 【带你重拾Redis】Redis数据结构及使用场景
Redis数据结构 Redis有着非常丰富的数据结构,这些数据结构可以满足非常多的应用场景, 如果对这些数据结构有一个比较清晰的认知,使用Redis也会更加得心应手. Redis主要支持以下数据结构: ...
- redis 数据结构
2019独角兽企业重金招聘Python工程师标准>>> redis对象 redis 数据结构 字符串对象 SDS(简单动态字符串) 列表对象 压缩列表(ziplist) 或 链表 ...
- Redis 数据结构与内存管理策略(上)
Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...
最新文章
- idea androidx控件不显示预览_如何解决SOLIDWORKS不显示缩略图预览的方法?
- 删除index.php,从URL中删除index.php - Codeigniter 2
- 黑客用python还是ruby-Python、Lua和Ruby之优劣
- 阿里云多账号管控与网络安全集中化管理能力升级发布
- Codeforces 85D Sum of Medians
- windows下的库文件在linux的使用,Windows、Linux之间传输文件的几种方式
- 如何获取当前刀具号_数控刀具的选用原则,如何使用数控刀具?一文全面介绍数控刀具...
- 绿屏后再现“粉屏”门!大量网友投诉iPhone 13粉屏问题 客服:非硬件问题
- 南京师范大学计算机科学与技术复试名单,2018年各学院硕士研究生复试办法及复试名单公示网址汇总表...
- 关于信号处理中的复信号
- 如何获得微信小游戏源码
- 大数据与AI平台:人工智能+大数据赋能产业供应链智能化风控核动力 PPT分享
- 深度学习常用软件包和基本环境配置
- 如何在“文件资源”左侧栏处删除坚果云图标
- 计算机安装系统后鼠标无法使用,重装系统鼠标键盘不能用怎么办 重装系统后鼠标键盘不能用解决办法...
- 通过css和js实现流星雨效果
- JavaScript/Js 大全
- 电子封装行业市场专项调查分析
- “美国老太太”酿造了全球金融危机
- java与交换机的命令_交换机命令之一--华为