Redis 对外暴露 String、Hash、Set、Sorted Set 等类型,内部会按值的规模和形态选择具体编码。理解这一层的目的,是解释内存和延迟变化,不是让业务依赖某个可能随版本改变的内部实现。
Table of contents
Open Table of contents
SDS:带长度的字节字符串
SDS 是 Simple Dynamic String。它记录已用长度和可用空间,可以在常数时间读取长度,并安全保存二进制数据。Redis String 不是 Java String,也不承诺 UTF-8;序列化、压缩和字符编码由客户端协议决定。
Dict:哈希表骨架
Redis 键空间、Hash 和 Set 等结构会使用字典思想:通过哈希定位桶。平均查找接近 O(1),但扩容需要迁移。Redis 采用渐进式 Rehash,把搬迁工作分散到后续操作,减少一次性长暂停。
O(1) 描述操作次数随元素数量的增长趋势,不代表固定是 1 微秒。值大小、哈希冲突、CPU、网络和内存压力仍会改变实际延迟。
SkipList:有序范围的折中
跳表通过多层稀疏索引加速有序查找,Sorted Set 可用它支持按分数范围、排名和更新。排行榜读取前 100 名很合适;一次取回百万成员仍会产生巨大响应和事件循环占用。
紧凑编码为何会“突然变大”
小型 Hash、List 或 Sorted Set 可使用 Listpack 等紧凑连续表示,减少指针和对象头开销。当成员数量或单值长度越过配置阈值,Redis 会转换为更通用结构。功能不变,但单元素开销和访问特征可能跳变。
用真实数据执行 MEMORY USAGE key SAMPLES 10,再结合 Key 数量估算总内存。不要只把 JSON 文本长度相加;Key、对象元数据、分配器碎片、复制缓冲、客户端缓冲和持久化峰值都占内存。
下一步
继续阅读07-04 RDB、AOF 与数据安全,理解内存数据如何保存到磁盘,以及仍可能丢多少。