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也要更新, 这样就又发送了连锁反应

连锁更新造成的影响:

  1. 在最坏情况下连锁更新对ziplist执行了N次重新分配
  2. 每次重新分配需要O(N)的时间, 那么就消耗了O(N^2)的时间
    当然连锁更新出现的概率很低, 并且当节点较少时, 出现连锁更新对性能影响不大

Redis之压缩链表ziplist相关推荐

  1. Redis之压缩列表ziplist

    Redis是基于内存的nosql,有些场景下为了节省内存redis会用"时间"换"空间". ziplist就是很典型的例子. ziplist是list键.has ...

  2. 【Redis源码剖析】 - Redis内置数据结构之压缩列表ziplist

    在前面的一篇文章[Redis源码剖析] - Redis内置数据结构之双向链表中,我们介绍了Redis封装的一种"传统"双向链表list,分别使用prev.next指针来指向当前节点 ...

  3. Redis 内存压缩实战,学习了!

    作者 | Xie Zefan 来源 | https://xiezefan.me/ 在讨论Redis内存压缩的时候,我们需要了解一下几个Redis的相关知识. 压缩列表 ziplist Redis的zi ...

  4. Redis 内存压缩实战

    在讨论Redis内存压缩的时候,我们需要了解一下几个Redis的相关知识. 压缩列表 ziplist Redis的ziplist是用一段连续的内存来存储列表数据的一个数据结构,它的结构示例如下图 压缩 ...

  5. redis 底层数据结构 压缩列表 ziplist

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

  6. redis压缩列表ziplist的连锁扩容

    redis中的压缩列表在插入数据的时候可能存在连锁扩容的情况. 在压缩列表中,节点需要存放上一个节点的长度,当上一个entry节点长度小于254个字节的时候,将会一个字节的大小来存放entry中的数据 ...

  7. redis的压缩列表源码ziplist解析

    压缩列表的具体数据结构如下: <zlbytes> <zltail> <zllen> <entry> <entry> ... <entr ...

  8. Redis 设计与实现 5:压缩列表 ziplist

    压缩列表是 ZSET.HASH和 LIST 类型的其中一种编码的底层实现,是由一系列特殊编码的连续内存块组成的顺序型数据结构,其目的是节省内存. ziplist 的结构 外层结构 下图展示了压缩列表的 ...

  9. redis的压缩列表和跳表,看这一篇文章就够了

    说到redis,大家的第一印象就是它快,它接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作.我们知道redis是内存数据库,所有的操作都是在内存上实现的,这是它快的一个重要原因,那么 ...

最新文章

  1. android系统学习笔记十一
  2. 【c语言训练】大,小写问题,【C语言训练】大、小写问题 (C语言代码)
  3. nginx反向代理https站点
  4. Redis 多机服务 : 主从同步、哨兵、集群
  5. IOS pushViewController如何去隐藏tabbar
  6. moxy json介绍_使用MOXy 2.5.1快速且有点脏的JSON模式生成
  7. 快了!CVPR 2019 所有录用论文题目列表刊出,即将开放下载!
  8. NIS企业级应用案例-统一Linux和Windows身份验证(二)
  9. 《深入剖析Tomcat》源码
  10. 传统CPU架构不再是高性能计算唯一选择
  11. TinyPNG压缩图片的网站
  12. java 打印 xps_使用Java 将PPT转换为PDF、XPS等格式
  13. xlsx.js导出表格设置批注框根据内容自动全部显示的解决办法
  14. Windows下Nginx安装使用
  15. 一款对话网页游戏-对话部分
  16. 【有利可图网】双十一“亮眼”设计大赏来了!!
  17. 开箱即用的物联网平台-IoTLink
  18. QWebEngine集成Netron可视化模型
  19. 金山办公2020校招前端开发工程师笔试题
  20. 计算机图形学的进展与展望

热门文章

  1. 复随机变量及高斯熵的概念
  2. 53. Leetcode 112. 路径总和 (二叉树-二叉树路径和)
  3. MATLAB从入门到精通系列之matlab常见问题集锦-(一)
  4. python 拓扑排序 dfs bfs_拓扑排序的DFS和BFS
  5. sql 时间范围查询_Excel中使用SQL查询,单元格范围最多支持65536行?
  6. 最小二乘法多项式曲线拟合原理与实现--转
  7. solrcloud使用中遇到的问题及解决方式
  8. solr源码分析之数据导入DataImporter追溯。
  9. mysql --The MEMORY Storage Engine--官方文档
  10. LESSON 10.110.210.3 SSE与二分类交叉熵损失函数二分类交叉熵损失函数的pytorch实现多分类交叉熵损失函数