、RedisObject(robj)对象头
Redis 所有 key、value 都会封装为redisObject,5 个字段:
表格
| 字段 | 作用 |
|---|---|
type:4bit |
对外数据类型:String/List/Set/ZSet/Hash |
encoding:4bit |
底层真实编码,共 11 种 |
lru:24bit |
对象最后访问时间,用于 LRU 淘汰 |
refcount |
引用计数,0 代表可回收,用于对象共享 |
*ptr |
指针,指向底层真实数据结构(SDS/ziplist/quicklist 等) |
命令:
OBJECT encoding key查看某个 key 的底层编码
二、Redis 一共 11 种编码
表格
| 编码宏 | 含义 |
|---|---|
| OBJ_ENCODING_RAW | raw SDS 长字符串 |
| OBJ_ENCODING_INT | 整数编码(字符串存数字) |
| OBJ_ENCODING_HT | 哈希表 dict |
| OBJ_ENCODING_ZIPMAP | 废弃 |
| OBJ_ENCODING_LINKEDLIST | 双向链表(3.2 前 list 用) |
| OBJ_ENCODING_ZIPLIST | 压缩列表 |
| OBJ_ENCODING_INTSET | 整数集合 |
| OBJ_ENCODING_SKIPLIST | 跳表 |
| OBJ_ENCODING_EMBSTR | embstr 短 SDS |
| OBJ_ENCODING_QUICKLIST | quicklist(3.2+list 默认) |
| OBJ_ENCODING_STREAM | Stream 流 |
三、5 大基础类型对应的底层编码
表格
| 对外类型 | 可选底层编码 |
|---|---|
| OBJ_STRING | int、embstr、raw |
| OBJ_LIST | Redis3.2 前:LinkedList + ZipList;3.2 之后:QuickList |
| OBJ_SET | intset、HT(dict) |
| OBJ_ZSET | ZipList、SkipList+HT |
| OBJ_HASH | ZipList、HT(dict) |
四、String 三种编码(高频考点)
String 底层基于 SDS 简单动态字符串,上限 512MB
- INT :存 long 范围内整数;数字直接存在 ptr 字段,不需要 SDS,最省内存
- EMBSTR :SDS 长度 ≤44 字节;
redisObject + SDS在一块连续内存 ,一次 malloc,效率高;不可修改,改了自动升级 raw - RAW:SDS 长度>44 字节;robj 和 SDS 分开两次内存分配,支持动态扩容
内存布局区别:
- INT:robj 内部 ptr 直接存数字
- EMBSTR:robj 头部和 SDS 连续紧挨
- RAW:robj 的 ptr 单独指向另一段 SDS 内存
五、List 类型底层演进
List 是双向队列,支持 lpush/rpush/lpop/rpop
- Redis 3.2 之前
- 条件:元素数量<512 且 每个元素<64 字节 → ZipList(紧凑,内存小)
- 超过阈值 → LinkedList 双向链表(内存碎片多、开销大)
- Redis3.2 之后(主流版本)统一 QuickList
- 结构:双向链表,链表每个节点是一个 ZipList
- 优点:兼顾 ZipList 低内存、LinkedList 无长度上限,支持压缩