返回顶部
首页 > 资讯 > 数据库 >详解redis数据结构之压缩列表
  • 317
分享到

详解redis数据结构之压缩列表

数据结构详解列表 2022-06-04 17:06:47 317人浏览 泡泡鱼
摘要

详解redis数据结构之压缩列表 Redis使用压缩列表作为列表键和哈希键的底层实现之一。当一个列表键只包含少量的列表项,并且每个列表项都是由小整数值或者是短字符串组成,那么redis就会使用压缩列表存储

详解redis数据结构之压缩列表

Redis使用压缩列表作为列表键和哈希键的底层实现之一。当一个列表键只包含少量的列表项,并且每个列表项都是由小整数值或者是短字符串组成,那么redis就会使用压缩列表存储列表项;同理,当一个哈希表包含的键值对都是由小整数值或者是短字符串组成,并且存储的键值对数目不多时,redis也会使用压缩列表来存储哈希表。以下是压缩列表存储结构:

查看图片

zlbytes长度为4个字节,记录了整个压缩列表所占用的字节数 zltail长度为4个字节,记录了压缩列表起始位置到压缩列表尾节点的偏移量 zllen长度为2个字节,记录了当前压缩列表中所拥有的entry的数量 entryX存储了实际的对象,其长度根据具体的实体而定 zlend长度为1个字节,保存了十进制的255,用于标记压缩列表的末端

通过上面的结构可以看出,压缩列表存储数据的为一整个数组,在这个数组中前12个字节固定保存了zlbytes、zltail和zllen三个表征整个压缩列表属性的数据,而后续的数组则保存了entry的数组,最后通过一个字节长度的属性zlend来记录当前压缩列表已经结束。

在上述结构中,我们并没有看到任何属性用以表征每个entry的长度及其存储的数据类型,如字符串或者是整型值,而压缩列表整体其实是一个数组,因而如果不对这两个类型的数据进行记录那么将无法对每一个entry进行区分。实际上,每个entry是由三部分组成:previous_entry_length、encoding和content。

1.previous_entry_length为一个整型值,记录了前一个节点整体占用字节的长度,当前一个节点的长度小于254时,该属性占用一个字节,当前一个节点长度大于等于254时,该属性则占用5个字节,其第一个字节会保存十进制的0xFE,即十进制的254,后四个字节则保存了前一节点的长度;

2.encoding属性长度不定,其主要保存了当前节点的编码格式和节点的长度。当encoding属性的最高两位为00、01或10时,表示其存储的是字节数组。其为00时,encoding占用1个字节,其后6位保存了content属性的长度;为01时,encoding占用2个字节,其后14位保存了content属性的长度;为10时,则其后38位保存了content属性的长度。当encoding属性的最高两位为11时,表示其存储的是一个整型值,并且此时encoding属性的长度为1个字节。当11后两位,也即第三位和第四位为00时,表示存储的是int16_t类型的整数,当其为01时,表示存储的是int32_t类型的整数,当其为10时,表示存储的是int64_t类型的整数,当其为11时,表示存储的是24位有符号整数。(这四种情况后续位上的值都为0)当11后五位为1,并且最后一位为0时,表示存储的是8位有符号整数。当11后两位为11时,那么该节点就没有content属性,该节点的属性值保存在encoding属性的后四个位上,并且其值要介于0~12之间。

3.content属性保存了该节点的实际的字符串或整型数据。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文档:

--结束END--

本文标题: 详解redis数据结构之压缩列表

本文链接: https://www.lsjlt.com/news/11856.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解redis数据结构之压缩列表
    详解redis数据结构之压缩列表 redis使用压缩列表作为列表键和哈希键的底层实现之一。当一个列表键只包含少量的列表项,并且每个列表项都是由小整数值或者是短字符串组成,那么redis就会使用压缩列表存储...
    99+
    2022-06-04
    数据结构 详解 列表
  • redis数据结构之压缩列表
    目录压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当...
    99+
    2024-04-02
  • Redis数据结构之链表详解
    目录1 链表和链表节点的结构2 链表相关的API1 链表和链表节点的结构 1.1 节点结构 节点的结构大概长下边这个样子: 那么,把这些节点就连起来就成了这个样子: 1.2 链表...
    99+
    2024-04-02
  • Java数据结构之散列表详解
    目录介绍1 散列表概述1.1 散列表概述1.2 散列冲突(hash collision)2 散列函数的选择2.1 散列函数的要求2.2 散列函数构造方法3 散列冲突的解决3.1 分离...
    99+
    2024-04-02
  • 详解redis数据结构之sds
    详解redis数据结构之sds 字符串在redis中使用非常广泛,在redis中,所有的数据都保存在字典(Map)中,而字典的键就是字符串类型,并且对于很大一部分字典值数据也是又字符串组成的。以下是sd...
    99+
    2022-06-04
    数据结构 详解 redis
  • JS数据结构之队列结构详解
    目录一.认识队列二.队列的应用三.队列类的创建四.队列的常见操作五.击鼓传花六.优先级队列七.优先级队列的实现一.认识队列 受限的线性结构: 我们已经学习了一种受限的线性结构:栈结构...
    99+
    2022-11-13
    JS队列结构 JS队列 JS 数据结构
  • Python数据结构之列表与元组详解
    目录Python 列表(list):1.序列介绍:2.列表的概述:3.创建一个列表4.列表的索引5.列表的分片6.列表的分片赋值7.循环遍历列表8.查找元素与计数9.列表增加元素:1...
    99+
    2024-04-02
  • 详解mysql表数据压缩
    目录【第一部分】一、表压缩概述:二、使用表的压缩三、InnoDB表的压缩优化1、何时用压缩表2、数据特性及压缩率3、数据库压缩和应用程序压缩4、工作负载特性和压缩率四、INNODB表...
    99+
    2024-04-02
  • Python数据结构之队列详解
    目录0. 学习目标1. 队列的基本概念1.1 队列的基本概念1.2 队列抽象数据类型1.3 队列的应用场景2. 队列的实现2.1 顺序队列的实现2.2 链队列的实现2.3 队列的不同...
    99+
    2024-04-02
  • Java数据结构之链表详解
    目录一、链表的介绍二、单链表的实现三、双向链表的实现四、循环链表的实现五,链表相关的面试题一、链表的介绍 什么是链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑...
    99+
    2024-04-02
  • C++数据结构之链表详解
    目录前言一、删除链表中给定值为key的节点二、反转链表三、返回链表的中间节点四、删除链表的倒数第K个节点五、分割链表六、合并两个有序链表七、删除有序链表中重复节点八、环形链表九、相交...
    99+
    2024-04-02
  • Python数据结构之链表详解
    目录0.学习目标1.线性表的链式存储结构1.1指针相关概念1.2指针结构1.3结点1.4结点类2.单链表的实现2.1单链表的初始化2.2获取单链表长度2.3读取指定位置元素2.4查找...
    99+
    2024-04-02
  • 详解python数据结构之队列Queue
    目录一、前言二、Queue的基本格式三、入队列函数 en_queue四、删除数据函数 de_queue一、前言 队列Queue是一种先进先出(FIFO,First In First ...
    99+
    2024-04-02
  • Java 数据结构之队列(Queue)详解
    目录 1、在Java中有哪些常见的队列? 2、Queue 接口分析 3、Deque 接口分析 4、PriorityQueue 的实现原理详解 5、使用Java数组实现队列的简单示例 1、在Java中有哪些常见的队列?         在...
    99+
    2023-10-12
    java 队列 Queue 接口 Deque 接口
  • Redis ziplist 压缩列表的源码解析
    目录前言源码解读ziplist 布局entry 节点prelenencoding 编码总结前言 相信对使用过 Redis 的人来说,数据类型 List 是不会陌生的吧。大多数人需要实现一个队列时候,首选的就是 List ...
    99+
    2022-06-30
    Redis ziplist 压缩列表 Redis 压缩列表 Redis ziplist
  • redis数据结构之intset的实例详解
    redis数据结构之intset的实例详解 在redis中,intset主要用于保存整数值,由于其底层是使用数组来保存数据的,因而当对集合进行数据添加时需要对集合进行扩容和迁移操作,因而也只有在数据量不大...
    99+
    2022-06-04
    数据结构 详解 实例
  • Java数据结构之单链表详解
    目录一、图示二、链表的概念及结构 三、单链表的实现四、完整代码的展示 一、图示 二、链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的...
    99+
    2024-04-02
  • Javascript数据结构之栈和队列详解
    目录前言栈(stack)栈实现解决实际问题栈的另外应用简单队列(Queue)队列实现队列应用 - 树的广度优先搜索(breadth-first search,BFS)优先队列优先队列...
    99+
    2024-04-02
  • 数据结构TypeScript之栈和队列详解
    目录栈结构特点出栈和入栈面向对象方法封装栈队列结构特点出队和入队面向对象方法封装队列栈结构特点 栈是线性表的其中一种,用于存储固定顺序的元素,元素增删具有先进后出的特点。 出栈和入...
    99+
    2023-01-30
    TypeScript数据结构栈队列 TypeScript数据结构
  • redis源码分析教程之压缩链表ziplist详解
    前言 压缩列表(ziplist)是由一系列特殊编码的内存块构成的列表,它对于Redis的数据存储优化有着非常重要的作用。这篇文章总结一下redis中使用非常多的一个数据结构压缩链表ziplist。该数据结构...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作