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)。新增、删除都可能导致连锁更新的发生。

相关推荐
prince053 小时前
用户积分系统怎么设计
java·大数据·数据库
原来是猿5 小时前
MySQL【内置函数】
数据库·mysql
難釋懷5 小时前
Redis分片集群插槽原理
数据库·redis·缓存
冷小鱼5 小时前
pgvector 向量数据库完全指南:PostgreSQL 生态的 AI 增强
数据库·人工智能·postgresql
陈天伟教授5 小时前
人工智能应用- 天文学家的助手:08. 星系定位与分类
前端·javascript·数据库·人工智能·机器学习
yunyun321235 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
ノBye~5 小时前
Centos7.6 Docker安装redis(带密码 + 持久化)
java·redis·docker
m0_662577975 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
ℳ๓₯㎕.空城旧梦6 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
Navicat中国6 小时前
Navicat 高效破解 SQL 编写繁琐难题,提升数据库设计效率
数据库·可视化·sql编写繁琐