redis ziplist结构和运用

【redis】ziplist详细解析 本文根据5.0.2版本的redis源码详细解析ziplist数据结构。 1 创建一个ziplist ziplist的内存结构如上图。 一个uint32_t的totalsize,保存当前ziplist所占用内存总量 接着一个uint32_t的offset,指向最后一个元素的位置,ziplist中的元素称作zlentry,起始时,offset指向ZIP_END 之后是uint16_... 阅读详情

redis ziplist结构和运用

ziplist结构

ziplist即压缩列表,其本质是字节数组。该数组元素可以是字节数组或者整数。

ziplist的结构可以分成五个部分:

整体结构示意图如下
在这里插入图片描述

  1. zlbytes:记录了整个ziplist的长度,占4个字节,因此压缩列表最长(2^32)-1字节;
  2. zltail:记录了ziplist结束的位置,即相对于起始位置的偏移量,占4个字节;
  3. zllen:记录了压缩列表的元素数目,占两个字节;当压缩列表的元素数目超过了(2^16)-1,即两个字节能够容纳的最大数量。此时需要遍历整个压缩列表才能获取到元素的数目;
  4. entry:记录了ziplist中的实际元素;
  5. zlend:记录了ziplist的结尾,占一个字节;

ziplist中的entry结构如下:
7. previous_entry_length:记录了压缩列表前一个节点的长度,该属性根据前一个节点的大小不同可以是1个字节或者5个字节;
8. encoding:记录了压缩列表的编码方式;
9. content: 记录系欸但的值

特点

  • 结构紧凑:这是一把双刃剑,访问效率高,同时更新效率低。且数据量较大时,可能导致大量的内存复制(当然数据量太大的时候,redis不会使用ziplist)
  • 逆向遍历:由于entry头部previous_entry_length,导致ziplist只能逆向遍历。但是插入数据还是在表头插入。
  • 连锁更新:对前一条数据的更新,可能导致后一条数据的prev_entry_length和encoding所需长度的变化,导致连锁更新反应;更新操作的最坏时间是O(N2)。(这种情况发生的概率很小,和中彩票一样)

应用

在redis中,list,zset和hash三种数据结构都直接或者间接使用到了ziplist。

hash:当hash的key值或者value值长度超过64的时候,就会从ziplist变成hashtable
在这里插入图片描述
list:list的默认编码是quicklist,quicklist是由双向链表和ziplist组合成的。即整个结构是一个双向链表,链表具体元素内容是ziplist。

zset:当有序集合满足这两个条件:1.元素个数小于128;2.保存的所有元素成员都小于64字节,则会使用ziplist作为存储的数据结构。不满足这两个条件时,就会使用skiplist来存储。

在这里插入图片描述

【Redis】ziplist与listpack源码剖析:Redis数据存储的演进与优化 ziplist是一种紧凑的字节数组数据结构,适用于存储小型列表。zlbytes:总字节数(4字节)。zltail:到列表尾节点的偏移量(4字节)。zllen:节点数量(2字节)。entry:实际存储的节点。zlend:结束标记(1字节,值为 0xFF)。每个节点包括prevlen(前一个节点的长度)、encoding(编码方式)和entry-data(实际存储内容)。 阅读详情

相关推荐

Redis内部数据结构详解之压缩链表(ziplist)

本文所引用的源码全部来自Redis2.8.2版本。 Redis中ziplist数据结构与API相关文件是:ziplist.h, ziplist.c, t_zset.c。 一、ziplist的构成 是一个4字节无符号整数,用来存储整个ziplist占用的字节数; 是一个4字节无符号整数,用来存储ziplist最后一个节点的相对于ziplist首地址偏移量; 是一个2字节

fmt.Println( 1万+

8.Redis数据结构之ZipList

highlight: arduino-light ZipList 数组存储的不是对象而是对象的引用 先看一段伪代码,伪代码如下 java List<Integer> list = new ArrayList<>(); ​ list.add(1); ​ Integer element = list.get(0); ​ list.remove(0); ​ System...

qq_30635523的博客 308

Redis系列之底层数据结构ZipList

Ziplist,压缩列表,这种数据结构会根据存入数据的类型和大小,分配大小不同的空间,所以是为了节省内存而采用的。因为这种数据结构是一种完整连续的数据单元,所以一旦发生数据改变,会产生连锁更新,严重影响访问性能,所以这种数据结构只适应于数据量比较小的情况。

Nicky's blog 1158

Redis数据结构之——ziplist

Redis数据结构之——ziplist

weixin_46935110的博客 2845

新手避坑指南:HT7036计量芯片SPI读取电压的完整流程(从复位到校准)

本文详细介绍了HT7036计量芯片的SPI读取电压完整流程,从硬件准备到校准设置,重点解析了复位引脚处理、SPI通信配置、芯片初始化及数据处理等关键步骤。针对常见问题如晶振焊接、SPI时序错误等提供实用解决方案,帮助开发者高效完成电压测量与校准。

weixin_30070339的博客 326

verilog常用模块1——按键消抖模块详解

按键消抖模块key_filter 1. 原理介绍 如图,按键未按下时keys信号为高电平,按下则为低电平;通过检测keys信号电平,就可以判断按键状态。 但反作用弹簧会导致抖动现象,电平信号出现一段不确定波形 一般情况下,抖动的电平信号为1的持续时间不会超过20ms,只要通过对抖动波形的发生时长计时(计数),当为1的时长超过20ms,则可判定 进入了发生了按键按下/释放动作,并确定按键状态...

coin的博客 1万+

redis中hash何时用ziplist

hash时什么情况才用ziplist 同时满足以下条件: 1. 哈希对象保存的所有键值的字符串长度小于64字节; 2. 哈希对象保存的键值对数量小于512个; 使用ziplist的优点: ziplist 1. 为什么不直接用hastable: 相比hashtable,ziplist结构少了指针,大大的减少了 内存的使用,而内存对于redis来说弥足珍贵, 2. 为什么不用 linklist? ziplist存储时内存分配是连续的,查询更快,这里的快只是 相对双端队列 ziplist如

dianxiaoer20111的博客 797

直流有刷电机控制 - 驱动电路(二)

1.如图所示为最常见的推挽驱动电路,我附加了具有正反转功能的电机驱动控制,正反转是由两个继电器组成。使用推挽电路来驱动NMOS管时充电电流和放电电流都很大,因此NMOS管导通快,关断也快,而且NMOS温度不会很高。下面来介绍一下该电路的原理。(1)PWM_MCU是由单片机给出的PWM波信号,该信号是由一些列高低电平的方波构成。当信号为高电平的时候Q3导通,经过R47再到Q5的g极,此时mos导通,如果是K1闭合是正转那么K2闭合就是反转。(2)当PWM低电平时使得Q3关断,Q6导通。

u011030644的博客 4719

Redis 数据结构之ziplist

Redis中压缩链表ziplist数据结构与API相关文件是:ziplist.h, ziplist.c, t_zset.c。 一、ziplist的构成 是一个4字节无符号整数,用来存储整个ziplist占用的字节数; 是一个4字节无符号整数,用来存储ziplist最后一个节点的相对于ziplist首地址偏移量; 是一个2字节无符号整数,存储zipli

逆风飞扬 2496

OpenWebUI外部模型配置异常排查与修复指南

本文详细解析了OpenWebUI外部模型配置异常的常见问题及解决方案,包括隐藏字符、数据库锁死等典型现象。通过错误日志分析和数据库修复实战指南,帮助开发者快速定位并解决配置问题,确保OpenWebUI与第三方大模型的稳定连接。

weixin_29205061的博客 310

视觉Transformer实战 | Vision Transformer(ViT)详解与实现

在计算机视觉领域,卷积神经网络 (CNN) 长期以来一直是处理图像任务的主流架构。然而,随着 Transformer 在自然语言处理领域的巨大成功,研究人员开始探索将这种基于自注意力机制的架构应用于视觉任务。Vision Transformer (ViT) 是这一探索的重要里程碑,它首次证明了纯 Transformer 架构在图像分类任务上可以超越最先进的 CNN 模型。本文将详细介绍 ViT 的技术原理,并使用 PyTorch 从零开始构建 ViT 模型用于图像分类任务。

盼小辉丶的博客 4万+

Redis源码剖析--哈希对象t_hash实现

hash对象概述 哈希对象的实现有点类似于版本3.2之前的列表对象实现,它的底层编码也有两种格式:ziplist 和 hashtable。 当哈希对象可以同时满足以下两个条件时, 哈希对象使用 ziplist 编码: 哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节; 哈希对象保存的键值对数量小于 512 个; 不能满足这两个条件的哈希对象需要使用 hashtable 编码...

harleylau的博客 1892

华为OD面试手撕真题 - 最大数

华为OD面试手撕真题 最大的数 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 337

Redis数据结构之list

redis列表相当于java语言里面的LinkedList,是链表而不是数组,这意味着list的插入和删除操作非常快,时间复杂度o(1),但是索引定位很慢,时间复杂度为o(n),列表中每个元素使用双向指针顺序,支持前向后向遍历 当列表弹出最后一个元素之后,数据结构自动删除,内存被回收 redis列表list常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串,塞进redis列表,另一个线程从这个列表中轮训数据进行处理 1.list结构的常用指令 队列: rpush key value1 value

weixin_37632716的博客 1459

Linux LT8912b调试记录(MIPI转LVDS/HDMI)

本文记录了在RK3588平台上使用LT8912B芯片实现MIPI转LVDS/HDMI的调试过程。主要包含设备树配置、驱动代码实现及常见问题解决。调试重点包括:1)正确配置1280x800分辨率的LVDS屏幕参数;2)确保I2C总线正常通信;3)解决花屏、图像抖动、黑屏等问题,涉及lane-rate计算、同步信号极性调整及MIPI模式选择。文中提供了详细的寄存器配置代码和故障排查方法,特别强调了I2C通信验证和电压匹配的重要性。通过参数优化和多种模式测试,最终实现了稳定的视频输出转换。

qq_45147279的博客 1086

【电源专题】LDO基础——热性能2

对于LDO散热而言,选择合适的元件并不是一件简单的任务。为了实现高效、尺寸得当并成本低的散热解决方案,我们在早期设计阶段就需要确保所有器件都可用并且已经考虑到元件和各种特性。

一点硬件 894

Redis 5种常用数据结构内部编码

字符串string 3种编码 raw int embstr 哈希hash 2种编码 hashtable ziplist 列表list 2种编码 linkedlist ziplist 集合set 2种编码 hashtable inset 有序集合zset 2种编码 skiplist ziplist

Marzlam的博客 1319

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

redis数据类型之list(列表)

文章目录一、队列二、栈三、其他操作四、内部实现压缩表(ziplist)快速列表 list是链表不是数组,故其插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。 一、队列 > rpush numbers one two three (integer) 3 > llen numbers (integer) 3 > lpop numbers "one"...

zjwendy的博客 869

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

redis value最大值_今天我才知道Redis有9种基本数据类型,据说只有5%的人知道,涨知识了...

90%的人知道Redis 5种最基本的数据结构,只有不到10%的人知道8种基本数据结构(5种基本+bitmap+GeoHash+HyperLogLog),只有不到5%的人知道9种基本数据结构(5.0最新版本数据结构Streams),只有不到1%的人掌握了所有9种基本数据结构以及8种内部编码,掌握这篇文章的知识点,让你成为面试官眼中Redis方面最靓的仔!说明:本文基于Redis-3.2....

weixin_34163588的博客 1495

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Redis常见数据结构分析

SDS:应用广泛。空间预分配和惰性删除; ZIPLIST:列表+哈希+有序集合。连续扩散; INTSET:集合。类型升级; DICT:哈希+集合+有序集合(和快表一起)/pubsub_channles/keys/expire_keys/watched_keys/matsers/sentinels/nodes/客户端命令表。rehash; SKIPLIST:有序集合。 LIST:列表/时间...

yanerhao的专栏 191

连集合底层实现原理都不知道,你敢说 Redis 用的很溜?

目录 SDS 的设计到底有多牛逼。 List、Set、Sorted Set、Hash 底层实现原理 SDS 的设计到底有多牛逼 Redis 使用 C 语言编写,但是并没有直接使用 C 语言自带的字符串,而是使用了 SDS 来管理字符串。接下来就来探讨下为什么 Redis 使用了 SDS 来管理字符串。 SDS 全称 Simple Dynamic String,即简单动态字符串。SDS 组成部分如下: free:表示 buf 中的空闲的空间大小,图左空闲空间为 0,图右空闲空间为 3 l

weixin_47067712的博客 263

redis底层数据结构之ziplist

一种连续内存空间存储的顺序数据结构,每个元素可以是字符串或整数。优点:节省内存空间。适用于存储小规模的列表或有序集合。缺点:修改操作可能引发连锁更新,影响性能。使用场景: 在列表键元素较少或元素都是小整数时使用。

xiong_tai的博客 1725

Redis - ziplist (压缩列表) 图文详解

List列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向List列表添加元素。最大长度为2^32-1,也即每个列表支持超过40亿个元素。Redis的List类型有多种实现方式,由双向链表或压缩列表(v7.0由listpack替代)实现的。这篇文章就是介绍其中一种实现ziplist-压缩列表。ziplist为了节省内存,采用了紧凑的连续存储。所以在修改操作下并不能像一般的链表那么容易,需要从新分配新的内存,然后复制到新的空间。httpshttps。............

一七令 1万+

8.Redis底层数据结构——ziplist和listpack

本文介绍了redis ziplist和listpack的实现,以及讲了为什么从ziplist迁移到了listpack

stable_zl的博客 1856

Redis数据结构ZipList和QuickList原理解析

在数据库的世界里,Redis 以其高效和灵活备受瞩目。而其中的 ZipList 和 QuickList 数据结构更是独具魅力。它们在内存管理和数据存储方面有着独特的设计理念,深入探究这些结构,能让我们更好地理解 Redis 的强大之处。这篇文章我给大家系统总结了Redis中ZipList和QuickList两种数据结构的原理。

2301_82300081的博客 1839

Redis基础数据结构之 ziplist 压缩列表 源码解读

Ziplist在存储小数据集时非常高效,但由于其紧凑存储的特性,在进行插入、删除和更新操作时可能会涉及到内存的重新分配和复制。因此,Ziplist最适合用于内存敏感的应用场景,特别是当数据集较小且操作以读取为主时。对于大型数据集或频繁的写操作,Redis可能会选择其他更适合的数据结构。

无休居士的博客 1889
上一篇: k8s中的整体架构 ,pod含义,服务类型,网络通讯等
下一篇: mysql性能调优
code_feien
博客等级 码龄7年 71粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值