Redis 五大核心数据结构知识点梳理
目录
一、String(字符串):最基础的键值存储
1. 核心定义
2. 底层实现
3. 关键特性
4. 核心命令
5. 典型应用
二、Hash(哈希):键值对的集合
1. 核心定义
2. 底层实现
3. 关键特性
4. 核心命令
5. 典型应用
三、List(列表):有序的字符串序列
1. 核心定义
2. 底层实现
3. 关键特性
4. 核心命令
5. 典型应用
四、Set(集合):无序的唯一字符串集合
1. 核心定义
2. 底层实现
3. 关键特性
4. 核心命令
5. 典型应用
五、Sorted Set(有序集合):按分数排序的唯一集合
1. 核心定义
2. 底层实现
3. 关键特性
4. 核心命令
5. 典型应用
总结:五大数据结构核心差异表
Redis 五种核心数据结构(String、Hash、List、Set、Sorted Set)是其高性能特性的核心载体,覆盖从简单缓存到复杂业务场景的需求。以下从核心定义、底层实现、关键特性、核心命令、典型应用五个维度,进行结构化知识点梳理,便于快速理解与记忆。
一、String(字符串):最基础的键值存储
1. 核心定义
- Redis 最基础的数据结构,对外表现为“键-值”对,值支持字符串、整数(64位有符号)、浮点数、二进制数据(如图片流)。
- 是构建复杂功能的“原子单元”,其他数据结构的元素本质也多为 String 类型。
2. 底层实现
依赖 SDS(Simple Dynamic String,动态字符串) 结构,解决 C 语言原生字符串缺陷,编码随值的类型/长度动态切换:
编码类型 | 适用场景 | 核心优势 |
| 值为 64 位有符号整数 | 直接存整数,支持 |
| 字符串长度 ≤ 44 字节(Redis 6.0+) | 键对象与 SDS 数据同块内存,减少碎片 |
| 字符串长度 > 44 字节 | 键与 SDS 分开存储,支持动态扩容,适合长字符串 |
3. 关键特性
- 操作性能:所有操作(增删改查)均为 O(1) 时间复杂度。
- 功能扩展:支持整数原子增减、字符串拼接/截取、二进制安全存储。
4. 核心命令
命令 | 功能 | 示例 |
| 设置键值(可选过期/不存在才设) |
|
| 获取值 |
|
| 整数原子加/减 1 |
|
| 字符串拼接 |
|
5. 典型应用
- 缓存热点数据(如商品详情、用户信息);
- 计数器(文章阅读量、接口调用次数);
- 分布式锁(基于
SET NX EX
实现); - Session 存储(分布式系统跨服务共享)。
二、Hash(哈希):键值对的集合
1. 核心定义
- 二级结构:“键-(字段 field - 值 value)”,一个 Hash 键可包含多个 field-value 对,适合存储多属性的复杂对象。
2. 底层实现
随“字段数量”和“字段值大小”动态切换编码,平衡内存与性能:
编码类型 | 适用场景 | 核心优势 |
| 字段数 ≤ 512(默认)+ 字段值 ≤ 64 字节(默认) | 连续内存存储,无指针开销,内存利用率极高 |
| 字段数 > 512 或字段值 > 64 字节 | 数组+链表解决哈希冲突,支持 O(1) 快速查询 |
3. 关键特性
- 操作粒度:可单独操作某个 field(增删改查),无需修改整个 Hash;
- 性能:单个 field 操作 O(1),遍历所有 field 操作 O(n)(n 为字段数)。
4. 核心命令
命令 | 功能 | 示例 |
| 设置 field-value 对 |
|
| 获取指定 field 的值 |
|
| 批量获取 field 值 |
|
| 获取所有 field/所有 value |
|
| 删除指定 field |
|
5. 典型应用
- 存储对象属性(如用户信息、商品规格);
- 购物车(用户 ID 为 Hash 键,商品 ID 为 field,数量为 value);
- 配置管理(存储系统/服务的多维度配置项)。
三、List(列表):有序的字符串序列
1. 核心定义
- 有序、可重复的字符串集合,支持从头部(left)、尾部(right) 高效插入/删除,底层基于双向链表思想实现。
2. 底层实现
Redis 3.2+ 统一使用 quicklist(快速列表),替代早期的 ziplist + linkedlist
:
- 结构:多个
ziplist
(压缩列表)用双向链表连接,每个ziplist
存多个元素; - 优势:兼顾
ziplist
的内存紧凑性和双向链表的两端操作高效性; - 关键配置:
list-max-ziplist-size
(单个 ziplist 最大大小)、list-compress-depth
(两端节点压缩深度)。
3. 关键特性
- 有序性:按元素插入顺序排列,支持索引访问(但中间索引操作 O(n));
- 性能:头部/尾部插入/删除 O(1),中间元素操作 O(n)。
4. 核心命令
命令 | 功能 | 示例 |
| 头部/尾部插入元素 |
|
| 头部/尾部删除元素 |
|
| 获取 [start, end] 区间元素 |
|
| 获取列表长度 |
|
5. 典型应用
- 消息队列(基于
LPUSH + RPOP
实现简单 FIFO 队列); - 最新列表(如“最新文章”“最近评论”,
LPUSH
新增 +LRANGE
取前 N); - 栈(基于
LPUSH + LPOP
实现 LIFO 栈)。
四、Set(集合):无序的唯一字符串集合
1. 核心定义
- 无序、元素唯一的字符串集合,支持交集、并集、差集等集合运算,适合“去重”和“关系计算”。
2. 底层实现
随元素类型和数量动态切换编码:
编码类型 | 适用场景 | 核心优势 |
| 所有元素为整数 + 元素数 ≤ 512(默认) | 紧凑存储,支持整数自动升级(16位→32位→64位),无哈希开销 |
| 元素含非整数或元素数 > 512 | 以元素为键、值为 |
3. 关键特性
- 唯一性:自动去重,重复插入元素会被忽略;
- 集合运算:支持交集(
SINTER
)、并集(SUNION
)、差集(SDIFF
); - 性能:插入/删除/判断元素存在 O(1),集合运算 O(n)(n 为元素总数)。
4. 核心命令
命令 | 功能 | 示例 |
| 添加元素 |
|
| 获取所有元素 |
|
| 判断元素是否存在 |
|
| 交集/并集/差集 |
|
| 删除元素 |
|
5. 典型应用
- 数据去重(如用户点赞的文章 ID、去重的日志 ID);
- 关系计算(社交场景的“共同好友”“好友推荐”);
- 标签系统(商品标签、用户兴趣标签,支持多标签筛选)。
五、Sorted Set(有序集合):按分数排序的唯一集合
1. 核心定义
- 在 Set“元素唯一”的基础上,为每个元素分配分数(score),按分数自动排序,支持按分数范围/排名查询,是 Redis 功能最强大的结构之一。
2. 底层实现
随元素数量和元素大小动态切换编码:
编码类型 | 适用场景 | 核心优势 |
| 元素数 ≤ 128(默认)+ 元素长度 ≤ 64 字节(默认) | 按“member→score”交替存储,分数升序,内存紧凑 |
| 元素数 > 128 或元素长度 > 64 字节 | - 跳表(skiplist):按 score 排序,O(log n) 范围/排名查询; |
3. 关键特性
- 有序性:按 score 升序排列,支持降序查询(
ZREVRANGE
); - 排名功能:可获取元素的排名(
ZRANK
/ZREVRANK
),或按排名取元素; - 性能:插入/删除/查改 score 均为 O(log n)。
4. 核心命令
命令 | 功能 | 示例 |
| 添加元素(指定分数) |
|
| 升序/降序取元素(带分数) |
|
| 获取元素分数 |
|
| 升序/降序排名 |
|
| 按分数范围取元素 |
|
5. 典型应用
- 排行榜系统(游戏积分、文章阅读量、商品销量 Top N);
- 优先级队列(任务优先级为 score,高分数任务优先执行);
- 范围统计(用户积分等级划分、按时间范围筛选数据)。
总结:五大数据结构核心差异表
数据结构 | 核心特点 | 有序性 | 唯一性 | 核心优势场景 | 操作复杂度(核心操作) |
String | 单键值、多类型 | - | - | 缓存、计数、锁 | O(1) |
Hash | 二级键值对 | - | - | 存储对象、购物车 | O(1)(单 field) |
List | 双向序列 | 插入序 | 不保证 | 消息队列、最新列表 | O(1)(头尾)、O(n)(中间) |
Set | 无序列合 | 无 | 保证 | 去重、关系计算 | O(1)(增删查)、O(n)(集合运算) |
Sorted Set | 分数排序 | 分数序 | 保证 | 排行榜、优先级队列 | O(log n)(增删查排) |