redis--数据类型 string list

、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

  1. INT :存 long 范围内整数;数字直接存在 ptr 字段,不需要 SDS,最省内存
  2. EMBSTR :SDS 长度 ≤44 字节;redisObject + SDS 在一块连续内存 ,一次 malloc,效率高;不可修改,改了自动升级 raw
  3. RAW:SDS 长度>44 字节;robj 和 SDS 分开两次内存分配,支持动态扩容

内存布局区别:

  • INT:robj 内部 ptr 直接存数字
  • EMBSTR:robj 头部和 SDS 连续紧挨
  • RAW:robj 的 ptr 单独指向另一段 SDS 内存

五、List 类型底层演进

List 是双向队列,支持 lpush/rpush/lpop/rpop

  1. Redis 3.2 之前
    • 条件:元素数量<512 且 每个元素<64 字节 → ZipList(紧凑,内存小)
    • 超过阈值 → LinkedList 双向链表(内存碎片多、开销大)
  2. Redis3.2 之后(主流版本)统一 QuickList
    • 结构:双向链表,链表每个节点是一个 ZipList
    • 优点:兼顾 ZipList 低内存、LinkedList 无长度上限,支持压缩
相关推荐
一条泥憨鱼1 小时前
【Redis | 黑马点评】分布式锁;Lua脚本;Redisson与看门狗 |源码万字详解
redis·分布式·lua
stark张宇2 小时前
库存扣减的“锁”事:悲观锁、乐观锁、分布式锁
redis·分布式·mysql
Sayuanni%36 小时前
Redis(初阶)
数据库·redis·缓存
未秃头的程序猿7 小时前
一次重复扣款的复盘:分布式锁加错了维度,比不加锁更危险
java·redis·后端
hweiyu001 天前
Redis命令:LLEN
redis·缓存
用户094248568031 天前
第3章:Redis字符串 String 实战:验证码、计数器与分布式开关
redis·源码
VX_bysjlw9851 天前
基于协同过滤的美食推荐系统的设计与实现32221-计算机毕设原创(免费领源码+带部署教程)
java·spring boot·redis·mysql·tomcat·maven·mybatis
hweiyu001 天前
Redis命令:RPUSHX
redis·缓存