🧵 Redis 字符串类型(String)的底层数据结构
Redis 的 字符串类型(String) 是最基础和常用的数据类型,但其底层实现并不局限于一种固定结构。根据字符串的长度和内容,Redis 会使用不同的数据结构来优化性能和内存利用率。
数据结构选择策略
Redis 根据字符串长度和内容自动选择最合适的底层数据结构:
数据结构 | 存储条件 | 优点 |
---|---|---|
整数编码(int) | 字符串可以转换为整数(如 "123" ) | 节省内存,快速计算 |
Embstr 编码 | 短字符串(≤ 44 字节) | 高效内存管理,减少分配次数 |
SDS | 长字符串或复杂二进制数据 | 动态扩展,二进制安全 |
SDS(Simple Dynamic String)
🔹 核心结构:
SDS 是 Redis 字符串类型的主要底层实现。它是对 C 语言 char*
的增强,解决了传统 C 字符串的一些问题(如 '\0'
终止、长度获取复杂等)。
🔹 结构定义:
struct sdshdr {
int len; // 当前字符串长度
int free; // 剩余未使用空间
char buf[]; // 字符数组,存储实际数据
};
🔹 特点:
- 动态扩展:自动扩展或收缩,避免频繁内存分配。
- 二进制安全:支持存储任意二进制数据(非
'\0'
终止)。 - O(1) 长度获取:
len
字段存储字符串长度,无需遍历。
🔹 应用:
- 存储 短字符串 和 普通文本 数据。
📦 2. 整数编码(int)
🔹 场景:
当字符串内容是 整数值(如 "123"
),且长度较短时,Redis 会将其存储为 整数类型 而不是 SDS。
🔹 优化原因:
- 节省内存:直接用整数存储,比用 SDS 表示更高效。
- 加速操作:整数直接参与计算,无需转换。
🔹 示例:
SET key 100 GET key # Redis 内部将 "100" 存储为整数
注意: 一旦字符串内容发生变化(如转换为非整数),Redis 会将其转换回 SDS。
📜 3. Embstr 编码(Embedded String)
🔹 场景:
用于存储 短字符串(通常小于 44 字节)。
🔹 特点:
- 内存连续分配:
embstr
会将 SDS 头部和实际数据存储在一块连续内存中。 - 减少内存分配次数:与常规 SDS 不同,
embstr
在创建时只进行一次内存分配。
🔹 优势:
- 提高短字符串操作的效率。
- 降低内存碎片。