redis-原理篇-ZipList(压缩列表)

介绍

ZipList是一种特殊的"双端链表",由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1)。

注意:ZipList中所有存储长度的数值(前三个部分)均采用小端字节序,即低位字节在前,高位字节在后

ZipListEntry

ZipList中的Entry并不像普通链表那样记录前后节点的指针,因为记录两个指针要占用16个字节,浪费内存。而是采用了下面的结构:

  • previous_entry_length:前一节点的长度,占1个或5个字节。
    • 如果前一节点的长度小于254字节,则采用1个字节来保存这个长度值
    • 如果前一节点的长度大于254字节,则采用5个字节来保存这个长度值,第一个字节为0xfe,后四个字节才是真实长度数据
  • encoding:编码属性,记录content的数据类型(字符串还是整数)以及长度,占用1个、2个或5个字节
  • content:负责保存节点的数据,可以是字符串或整数

连锁更新问题

ZipList的每个Entry都包含previous_entry_length来记录上一个节点的大小,长度是1个或5个字节:

  • 如果前一节点的长度小于254字节,则采用1个字节来保存这个长度值
  • 如果前一节点的长度大于等于254字节,则采用5个字节来保存这个长度值,第一个字节为0xfe,后四个字节才是真实长度数据

现在,假设我们有N个连续的、长度为250~253字节之间的entry,因此entry的previous_entry_length属性用1个字节即可表示

就在这时,在头节点处新增了一个254字节的entry,这时,后面的entry的previous_entry_length属性就会改为使用5个字节,这时这个entry的长度也大于等于了254字节,因此后面的又要接着改

ZipList这种特殊情况下产生的连续多次空间扩展操作称之为连锁更新(Cascade Update)。新增、删除都可能导致连锁更新的发生。

相关推荐
木风小助理2 小时前
PerconaXtraBackup工作原理深度解析
数据库
lkbhua莱克瓦242 小时前
进阶-锁章节
数据库·sql·mysql·oracle·存储过程·
山峰哥2 小时前
JOIN - 多表关联的魔法——3000字实战指南
java·大数据·开发语言·数据库·sql·编辑器
IT大白2 小时前
4、Redis核心原理
数据库·redis·缓存
wzy06232 小时前
Redis 集群迁移方案:从三节点到三节点的无缝过渡
数据库·redis·缓存
墨笔之风2 小时前
MySQL与PostgreSQL选型对比及适用场景说明
数据库·mysql·postgresql
肥大毛2 小时前
Oracle中Merge Using用法
数据库·oracle
程序员Agions3 小时前
N+1 查询:那个让你 API 慢成 PPT 的隐形杀手
数据库·后端