先看日常用法:保存一份用户资料
下面的 profile:42 是“42 号用户资料”这个 Redis key(键,也就是数据在 Redis 中的名称);name 和 age 是资料字段。HSET 是向 Hash 写字段的命令,业务只关心字段能否正确写入和读取。
HSET profile:42 name Ada age 28
HGET profile:42 name
# 返回 "Ada"
这份资料只有两个字段时,若每个字段都单独创建对象和指针,管理开销可能比数据本身还大;资料增长到几万字段后,若仍把所有内容挤在一段连续内存里,每次查找或中间修改又可能走很久。
小资料的主要矛盾
字段很少,重点是减少对象头、指针和多次内存申请,让数据紧挨着存。
大资料的主要矛盾
字段很多,重点是快速定位和稳定扩展,可以接受更多索引与指针开销。
再用包装类比理解“两层”
你在快递面单上写的是“书”“衣服”或“杯子”,这是对外的类别;仓库真正选择纸箱、文件袋还是泡沫盒,这是内部包装。Redis 的数据类型像面单,底层编码像包装。
最小观察:类型和编码不是同一个答案
TYPE 是查看对外数据类型的命令;OBJECT ENCODING 是查看当前内部编码的命令。对刚才的 profile:42,前者回答“这是 Hash”,后者回答“这份 Hash 现在用什么结构保存”。
TYPE profile:42 # hash OBJECT ENCODING profile:42 # 常见结果为 listpack;实际结果由版本、配置和内容决定
只改变观察问题,答案就不同:TYPE 面向命令语义,OBJECT ENCODING 面向内存实现。这是后面所有结构的总入口。