Redis之压缩链表ziplist
ziplist
- 什么是ziplist?
- ziplist结构
- entry节点的结构
- 添加或者删除引起的连锁更新
什么是ziplist?
顾名思义ziplist就是压缩链表, 压缩链表就是为节省内存而生的
因为Redis是基于内存的数据库, 所以读取或者写入的速度很快, 但由于内存资源有限, 所以我们要尽可能的节约内存, 于是Redis官方就创建出了ziplist这一节省内存的结构
ziplist结构
下面我们来看一下ziplist的结构
- zlbytes: ziplist的长度(单位: 字节),是一个32位无符号整数
- zltail: ziplist最后一个节点的偏移量,反向遍历ziplist或者pop尾部节点的时候有用。
- zllen: ziplist的节点(entry)个数
- entry : ziplist中间储存的节点
- zlend : 标记ziplist结尾
entry节点的结构
- previous-entry_length : 用来存储上一个节点的长度, 当前以节点的长度小于254字节时, 本身的长度为1字节, 当前一节点的长度大于等于254时,自身长度为5字节
- encoding : 编码 不同类型的编码代表这个节点存储的内容和长度是什么
- content : 内容, 这里就是具体存储数据的地方
encoding按照下图规则来可以看出来具体content存储的是什么
添加或者删除引起的连锁更新
e1~en节点的长度均介于250 ~253之间, 当我在头部新加了一个节点他的长度是254字节, 那么e1就要更新他的previous_entry_length属性, 要把原来1字节更新为5字节, 这样一更新, e2也要更新e1的长度, 这样就引起了连锁反应
当big节点长度大于等于254时, small节点的存储前一节点长度的大小是5字节, 但我们将small节点删除后, e1存储前一个节点的长度就不够了, 这样就需要更新, e1一更新, e2也要更新, 这样就又发送了连锁反应
连锁更新造成的影响:
- 在最坏情况下连锁更新对ziplist执行了N次重新分配
- 每次重新分配需要O(N)的时间, 那么就消耗了O(N^2)的时间
当然连锁更新出现的概率很低, 并且当节点较少时, 出现连锁更新对性能影响不大
Redis之压缩链表ziplist相关推荐
- Redis之压缩列表ziplist
Redis是基于内存的nosql,有些场景下为了节省内存redis会用"时间"换"空间". ziplist就是很典型的例子. ziplist是list键.has ...
- 【Redis源码剖析】 - Redis内置数据结构之压缩列表ziplist
在前面的一篇文章[Redis源码剖析] - Redis内置数据结构之双向链表中,我们介绍了Redis封装的一种"传统"双向链表list,分别使用prev.next指针来指向当前节点 ...
- Redis 内存压缩实战,学习了!
作者 | Xie Zefan 来源 | https://xiezefan.me/ 在讨论Redis内存压缩的时候,我们需要了解一下几个Redis的相关知识. 压缩列表 ziplist Redis的zi ...
- Redis 内存压缩实战
在讨论Redis内存压缩的时候,我们需要了解一下几个Redis的相关知识. 压缩列表 ziplist Redis的ziplist是用一段连续的内存来存储列表数据的一个数据结构,它的结构示例如下图 压缩 ...
- redis 底层数据结构 压缩列表 ziplist
压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键 ...
- redis压缩列表ziplist的连锁扩容
redis中的压缩列表在插入数据的时候可能存在连锁扩容的情况. 在压缩列表中,节点需要存放上一个节点的长度,当上一个entry节点长度小于254个字节的时候,将会一个字节的大小来存放entry中的数据 ...
- redis的压缩列表源码ziplist解析
压缩列表的具体数据结构如下: <zlbytes> <zltail> <zllen> <entry> <entry> ... <entr ...
- Redis 设计与实现 5:压缩列表 ziplist
压缩列表是 ZSET.HASH和 LIST 类型的其中一种编码的底层实现,是由一系列特殊编码的连续内存块组成的顺序型数据结构,其目的是节省内存. ziplist 的结构 外层结构 下图展示了压缩列表的 ...
- redis的压缩列表和跳表,看这一篇文章就够了
说到redis,大家的第一印象就是它快,它接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作.我们知道redis是内存数据库,所有的操作都是在内存上实现的,这是它快的一个重要原因,那么 ...
最新文章
- android系统学习笔记十一
- 【c语言训练】大,小写问题,【C语言训练】大、小写问题 (C语言代码)
- nginx反向代理https站点
- Redis 多机服务 : 主从同步、哨兵、集群
- IOS pushViewController如何去隐藏tabbar
- moxy json介绍_使用MOXy 2.5.1快速且有点脏的JSON模式生成
- 快了!CVPR 2019 所有录用论文题目列表刊出,即将开放下载!
- NIS企业级应用案例-统一Linux和Windows身份验证(二)
- 《深入剖析Tomcat》源码
- 传统CPU架构不再是高性能计算唯一选择
- TinyPNG压缩图片的网站
- java 打印 xps_使用Java 将PPT转换为PDF、XPS等格式
- xlsx.js导出表格设置批注框根据内容自动全部显示的解决办法
- Windows下Nginx安装使用
- 一款对话网页游戏-对话部分
- 【有利可图网】双十一“亮眼”设计大赏来了!!
- 开箱即用的物联网平台-IoTLink
- QWebEngine集成Netron可视化模型
- 金山办公2020校招前端开发工程师笔试题
- 计算机图形学的进展与展望
热门文章
- 复随机变量及高斯熵的概念
- 53. Leetcode 112. 路径总和 (二叉树-二叉树路径和)
- MATLAB从入门到精通系列之matlab常见问题集锦-(一)
- python 拓扑排序 dfs bfs_拓扑排序的DFS和BFS
- sql 时间范围查询_Excel中使用SQL查询,单元格范围最多支持65536行?
- 最小二乘法多项式曲线拟合原理与实现--转
- solrcloud使用中遇到的问题及解决方式
- solr源码分析之数据导入DataImporter追溯。
- mysql --The MEMORY Storage Engine--官方文档
- LESSON 10.110.210.3 SSE与二分类交叉熵损失函数二分类交叉熵损失函数的pytorch实现多分类交叉熵损失函数