Redis核心数据结构之压缩列表(一)

这篇具有很好参考价值的文章主要介绍了Redis核心数据结构之压缩列表(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

压缩列表

概述

压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。

例子

  • 例如,执行以下命令将创建一个压缩列表实现的列表键,列表键里面包含的都是1、3、5、10086这样的小整数值,以及"hello"、"world"这样的短字符串。另外,当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现。
127.0.0.1:6379> RPUSH lst 1 3 5 10086 "hello" "world"
(integer) 6
127.0.0.1:6379> OBJECT ENCODING lst
"ziplist"
127.0.0.1:6379>
  • 举个例子,执行以下命令将创建一个压缩列表实现的哈希键:
    哈希键里面包含的所有键和值都是小整数值或者短字符串。
127.0.0.1:6379> HMSET profile  "name" "VinPink" "age" 28 "job" "Programmer"
OK
127.0.0.1:6379> OBJECT ENCODING profile
"ziplist"
127.0.0.1:6379>

压缩列表的构成

压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。
Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库
Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库

例子

Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库

  • 1.列表zlbytes属性的值为0x50(十进制80),表示压缩列表的总长为80字节
  • 2列表zltail属性的值为0x3c(十进制60),这表示如果我们有一个指向压缩
    列表起始地址的指针P,那么只要用指针P加上偏移量60,就可以计算出表尾节点entry3的地址
  • 3.列表zllen属性为0x3(十进制3),表示压缩列表包含三个节点
    Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库
  • 1.列表zlbytes属性的值为0xd2(十进制210),这表示压缩列表的总长为210字节
  • 2.列表zltail属性的值为0xb3(十进制179),这表示如果我们有一个指向压缩列表起始地址的P,那么只要用指针P加上偏移量179,就可以计算出表尾节点entry5的地址
  • 3.列表zllen属性的值为0x5(十进制5),表示压缩列表包含五个节点

压缩列表节点的构成

每个压缩列表节点可以保存一个字节数组或者一个整数值,其中,字节数组可以是以下三种长度之一:

  • 1.长度小于等于63(2 ^ 6 - 1)字节的字节数组
  • 2.长度小于等于16383(2 ^ 14 - 1)字节的字节数组
  • 3.长度小于等于4294967295(2 ^ 32 - 1)字节的字节数组
    而整数值则可以是以下六种长度之一:
  • 1.4位长,介于0至12之间的无符号整数
  • 2.1字节长的有符号整数
  • 3.3字节长的有符号整数
  • 4.int16_t类型整数
  • 5.int32_t类型整数
  • 6.int64_t类型整数
    每个压缩列表节点都由previous_entry_length、encoding、content三个部分组成
    Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库

previous_entry_length

节点的previous_entry_length属性以字节为单位,记录了压缩列表前一个节点的长度。previous_entry_length属性的长度可以是1字节或者5字节:
1.如果前一节点的长度小于254字节,那么previous_entry_length属性的长度为1字节:前一节点的长度保存在这一个字节里面
2.如果潜移节点的长度大于等于254字节,那么previous_entry_length属性的长度为5字节:其中属性的第一字节会被设置为0xFE(十进制254),而之后的四个字节则用于保存前一节点的长度

因为节点的previous_entry_length属性记录了前一个节点的长度,所以程序可以通过指针运算,根据当前节点的起始地址来计算出前一个节点的起始地址

例子

Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库文章来源地址https://www.toymoban.com/news/detail-840439.html

  • 图中展示了一个包含一字节长previous_entry_length属性的压缩列表节点,属性 的值为0x05,表示前一节点的长度为5字节
    Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库
  • 图中展示了一个包含五字节长previous_entry_length属性的压缩节点,属性的值为0xFE00002766,其中值的最高位0xFE表示这是一个五字节长的previous_entry_length属性,而之后的四字节0x00002766(十进制10086)才是前一节点的实际长度
    Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库
  • 举个例子,如果有一个指针当前节点的起始地址的指针c,那么只要用指针c减去当前节点previous_entry_length属性的值,就可以得出一个指向前一个节点起始地址的指针p,如图所示
    Redis核心数据结构之压缩列表(一),Redis,redis,数据结构,数据库
  • 压缩列表的从表尾向表头遍历操作就是使用这一原理实现的,只要拥有了一个指向某个节点起始地址的指针,那么通过这个指针以及这个节点的previous_entry_length属性,程序就可以一直向前一个节点回溯,最终到达压缩列表的表头节点。
    1.首先,拥有指向压缩列表表尾节点entry4起始地址的指针p1(指向表尾节点的指针可以通过指向压缩列表起始地址的指针加上zltai属性的值得出)
    2.通过p1减去entry4节点previous_entry_length属性的值,得到一个指向entry4前一个节点entry3起始地址的指针p2
    3.通过p2减去entry3节点previous_entry_length属性的值,得到一个指向entry3前一节点entry2起始地址的指针p3
    4.通过用p3减去entry2节点previous_entry_length属性的值,得到一个指向entry2前一节点最终,从表尾节点向表头节点遍历了整个列表

到了这里,关于Redis核心数据结构之压缩列表(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Redis数据结构——快速列表quicklist、快表

    Redis数据结构——快速列表quicklist、快表

    Redis中的数据结构,链表和压缩列表这两种数据结构是列表对象的底层实现方式。 当时考虑到链表的附加空间太大,节点的内存都是单独分配的,还会导致内存碎片化问题严重。 因此从Redis3.2开始,对列表的底层数据结构进行了改造,即使用 quickList代替链表list和压缩列表z

    2024年02月12日
    浏览(10)
  • Redis核心数据结构实战与高性能解析

    Redis核心数据结构实战与高性能解析

    目录 一、安装Redis 二、Redis线程与高性能 2.1 Redis是单线程么? 2.2 Redis读写是单线程为何这么快? 2.3 Redis如何处理并发操作命令? 三、核心数据结构实战 3.1 字符串常用操作实战 SET 存入键值对 SETNX SETEX MSET 批量存入键值对 MSETNX DECR 原子减1 DECRBY 原子减 INCR 原子加1 INCRBY 原子

    2024年02月07日
    浏览(10)
  • Redis学习路线(2)—— Redis的数据结构

    一、Redis的数据结构 Redis是一个Key-Value的数据库,key一般是String类型,不过Value的类型却有很多: String: Hello World Hash: {name: \\\"jack\\\", age: 21} List: [A - B - C - C] Set: {A, B, C} SortedSet: {A: 1, B: 2, C: 3} GEO: {A: (120.3, 30.5)} BitMap: 0110110101110101011 HyperLog: 0110110101110101011 由于Redis对数据

    2024年02月15日
    浏览(7)
  • 【Redis】Redis中的数据结构和内部编码

    【Redis】Redis中的数据结构和内部编码

    type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构, 实际上Redis针对每种数据结构都有⾃⼰的底层内部编码实现,⽽且是多种实现,这样Redis会在合适的

    2024年02月07日
    浏览(9)
  • redis1之安装redis,启动,常用数据结构

    redis1之安装redis,启动,常用数据结构

      目录 redis安装与启动、常见数据结构 启动  Redis客户端 数据结构与常见的命令  redis的通用命令  String类型的用法 Hash命令的用法  List命令  Set命令  SortedSet类型用法 1,在linux上安装上gcc的依赖,我这里是centos7.6,gcc是4.5 我们在LInux上查看一下我们的系统信息  我这里安装

    2024年02月06日
    浏览(20)
  • Redis底层数据结构

    SDS全称是Simple Dynamic String,具有如下显著的特点: 常数复杂度获取字符串长度:C语言获取一个字符串的长度需要遍历整个字符串时间复杂度为O(N),而SDS在属性len中记录了字符串长度,获取字符串长度的时间复杂度为O(1)。 杜绝缓冲区溢出:C字符串在执行拼接字符串时,如果

    2024年02月13日
    浏览(13)
  • redis 数据结构(二)

    redis 数据结构(二)

    整数集合是  Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素,并且元素数量不时,就会使用整数集这个数据结构作为底层实现。 整数集合本质上是一块连续内存空间,它的结构定义如下: 可以看到,保存元素的容器是一个 contents 数组,虽然 contents 被声明为 i

    2024年02月09日
    浏览(11)
  • Redis 数据结构详解

    Redis 数据结构详解

    Redis 数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。 Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。 原子操作:最小的操作单位,不能继续拆分。即最小的执行单位,不会被其他命令插入。高并发

    2024年02月05日
    浏览(8)
  • Redis - 底层数据结构

    Redis - 底层数据结构

    Redis 的底层数据结构主要以下几种: SDS(Simple Dynamic String, 简单动态字符串) ZipList(压缩列表) QuickList(快表) Dict(字典) IntSet(整数集合) ZSkipList(跳跃表) 在 Redis 中,并不会直接使用 C 语言自带的字符串结构作为实际的存储结构,而只是将字符串作为字面量使用,大多数情况使用自

    2023年04月12日
    浏览(10)
  • Redis数据结构简介

    Redis数据结构简介

    对redis来说,所有的key(键)都是字符串。     1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value。   String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。   使用:get 、 set 、 del 、 incr、 decr 等

    2024年02月07日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包