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对象相关推荐

  1. 「Redis数据结构」集合对象(Set)

    「Redis数据结构」集合对象(Set) 文章目录 「Redis数据结构」集合对象(Set) 一.概述 二.结构 三.编码转换 四.小结 一.概述 Set是Redis中的单列集合,其特点为不保证有序性 ...

  2. 「Redis数据结构」字符串对象(String)

    「Redis数据结构」字符串对象String 文章目录 「Redis数据结构」字符串对象String 一.概述 二.编码分类 int embstr row 三.小结 四.参考 一.概述 字符串数据类型 ...

  3. Redis数据结构-对象

    目录 前言 1.对象的类型与编码 1.1.类型 2.编码和底层实现 2.1.字符串对象 2.2.列表对象 2.3.哈希对象 2.4.集合对象 2.5.有序集合对象 参考 最后 前言 Redis并没有直 ...

  4. 【Redis-09】面试题之Redis数据结构与对象-RedisObject(下篇)

     承接上篇[Redis-08]面试题之Redis数据结构与对象-RedisObject(上篇) 8. type-字符串string 8.1 字符串的三种encoding编码(int + embstr ...

  5. 「Redis数据结构」哈希对象(Hash)

    「Redis数据结构」哈希对象(Hash) 文章目录 「Redis数据结构」哈希对象(Hash) 一.概述 二.编码 ZipList HashTable 三.编码转换 一.概述 Redis中hash对 ...

  6. Redis 数据结构-字典源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 相关文章 Redis 初探-安装与使用 Redis 数据结构-字符串源码分析 本文将从以下几个方面介绍 前言 字典结构图 字典 ...

  7. 为了拿捏 Redis 数据结构,我画了 40 张图

    Redis 为什么那么快? 除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理. 因此,这次我们就来好 ...

  8. 【带你重拾Redis】Redis数据结构及使用场景

    Redis数据结构 Redis有着非常丰富的数据结构,这些数据结构可以满足非常多的应用场景, 如果对这些数据结构有一个比较清晰的认知,使用Redis也会更加得心应手. Redis主要支持以下数据结构: ...

  9. redis 数据结构

    2019独角兽企业重金招聘Python工程师标准>>> redis对象 redis 数据结构 字符串对象  SDS(简单动态字符串) 列表对象  压缩列表(ziplist) 或 链表 ...

  10. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

最新文章

  1. idea androidx控件不显示预览_如何解决SOLIDWORKS不显示缩略图预览的方法?
  2. 删除index.php,从URL中删除index.php - Codeigniter 2
  3. 黑客用python还是ruby-Python、Lua和Ruby之优劣
  4. 阿里云多账号管控与网络安全集中化管理能力升级发布
  5. Codeforces 85D Sum of Medians
  6. windows下的库文件在linux的使用,Windows、Linux之间传输文件的几种方式
  7. 如何获取当前刀具号_数控刀具的选用原则,如何使用数控刀具?一文全面介绍数控刀具...
  8. 绿屏后再现“粉屏”门!大量网友投诉iPhone 13粉屏问题 客服:非硬件问题
  9. 南京师范大学计算机科学与技术复试名单,2018年各学院硕士研究生复试办法及复试名单公示网址汇总表...
  10. 关于信号处理中的复信号
  11. 如何获得微信小游戏源码
  12. 大数据与AI平台:人工智能+大数据赋能产业供应链智能化风控核动力 PPT分享
  13. 深度学习常用软件包和基本环境配置
  14. 如何在“文件资源”左侧栏处删除坚果云图标
  15. 计算机安装系统后鼠标无法使用,重装系统鼠标键盘不能用怎么办 重装系统后鼠标键盘不能用解决办法...
  16. 通过css和js实现流星雨效果
  17. JavaScript/Js 大全
  18. 电子封装行业市场专项调查分析
  19. “美国老太太”酿造了全球金融危机
  20. java与交换机的命令_交换机命令之一--华为

热门文章

  1. 电阻(1)电阻种类篇
  2. WIN7共享WIFI上网
  3. 常见的研究方法有哪些?
  4. js基础-点击切换div背景颜色
  5. Mysql 免安装版本
  6. paypal标准支付流程图
  7. paypal php 开发,PHP语言开发Paypal支付demo的具体实现
  8. 物联网核心技术射频识别技术,传感技术,网络通信技术、嵌入式系统技术和云计算的基本介绍
  9. 技术债务-坏味道、Bug、漏洞
  10. 使用PicGo快速搭建图床