redis--ziplist

ZipList 是 Redis 早期底层的连续内存双端链表,节省内存,用于 List、Hash、Zset 底层(新版 Redis 很多场景替换为 QuickList)

一、ZipList 整体结构

zlbytes | zltail | zllen | entry... | zlend

表格

字段 占用字节 作用
zlbytes 4B 整个压缩列表总内存字节数
zltail 4B 表尾节点相对起始地址偏移,快速拿到尾节点
zllen 2B 节点数量;最大值 65534,超过后此字段固定写 65535,必须遍历才能统计真实个数
entry 不定长 列表存储的数据节点
zlend 1B 固定0xFF,标记压缩列表结束
  • 特性:连续内存,两端增删 O (1),不需要存储前后指针,通过记录前节点长度实现反向遍历,节约内存。

二、ZipListEntry 节点结构

previous_entry_length | encoding | content

  1. previous_entry_length:前一个节点的长度
    • 前节点长度 <254B:占用1 字节,直接存长度
    • 前节点长度 ≥254B:占用5 字节 ,首字节固定0xFE,后面 4 字节存真实长度
    • 作用:从后往前遍历的时候,用当前 entry 地址减去该值,直接拿到上一个节点起始地址。
  2. encoding:编码,标记 content 是字符串 / 整数、以及长度,占用 1/2/5 字节
  3. content:数据本体,存字符串或者整数

三、Encoding 编码规则

✅ 字符串类型(开头 bit:00 / 01 /10)

表格

编码 占用字节 字符串最大长度
00pppppp 1B ≤63 字节
01pppppp qqqqqqqq 2B ≤16383 字节
10000000 + 4 字节长度 5B ≤4294967295 字节

✅ 整数类型(开头 bit:11,固定占 1 字节)

表格

编码 对应类型
11000000 int16_t(2 字节)
11010000 int32_t(4 字节)
11100000 int64_t(8 字节)
11110000 24 位有符号整数(3 字节)
11111110 8 位有符号整数(1 字节)
1111xxxx 直接用低 4 位存数值,范围 1~10,值 = xxxx-1
相关推荐
徐小黑ACG1 小时前
Redis-基础
数据库·redis·缓存
鶴哥只手遮天3 小时前
《Redis 8.10.3 深度剖析》系列 ·第 10 章 Hash 一:`listpack`、`hashtable` 与 `LISTPACK_EX`
redis·后端·开源
IT规划师7 小时前
Redis 数据类型全解 - GEO 地理空间:附近的人、外卖、打车——背后原理与精度陷阱(九)
redis·.net
我不会起名字3221 天前
Redis 从 0 到 1(三十三):机器断电 Redis 起不来——AOF/RDB 损坏的 4 步抢救流程
redis·数据恢复·aof·rdb·排查
csdn_aspnet1 天前
Redis 入门:Windows、Mac安装指南
数据库·windows·redis·缓存·mac
IT规划师1 天前
Redis 数据类型全解 - HyperLogLog:12 KB 估出亿级 UV(八)
redis·uv·hyperloglog·.net10
aiks_yuan2 天前
Token 放 Redis 还是用 JWT:Java 实测验签和查 Redis 耗时,退出登录、改密码踢下线怎么做(jjwt 0.12 + Redis 7.2)
redis