跳到正文
Elaine Blog
返回

SDS、Dict、SkipList 与紧凑编码

Redis 与缓存工程

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 与数据安全,理解内存数据如何保存到磁盘,以及仍可能丢多少。


分享这篇文章:

上一篇
Redis 线程模型、I/O 多路复用与命令原子性
下一篇
RDB、AOF 与数据安全