目录
[1. 核心定义](#1. 核心定义)
[2. 底层实现](#2. 底层实现)
[3. 关键特性](#3. 关键特性)
[4. 核心命令](#4. 核心命令)
[5. 典型应用](#5. 典型应用)
[1. 核心定义](#1. 核心定义)
[2. 底层实现](#2. 底层实现)
[3. 关键特性](#3. 关键特性)
[4. 核心命令](#4. 核心命令)
[5. 典型应用](#5. 典型应用)
[1. 核心定义](#1. 核心定义)
[2. 底层实现](#2. 底层实现)
[3. 关键特性](#3. 关键特性)
[4. 核心命令](#4. 核心命令)
[5. 典型应用](#5. 典型应用)
[1. 核心定义](#1. 核心定义)
[2. 底层实现](#2. 底层实现)
[3. 关键特性](#3. 关键特性)
[4. 核心命令](#4. 核心命令)
[5. 典型应用](#5. 典型应用)
[五、Sorted Set(有序集合):按分数排序的唯一集合](#五、Sorted Set(有序集合):按分数排序的唯一集合)
[1. 核心定义](#1. 核心定义)
[2. 底层实现](#2. 底层实现)
[3. 关键特性](#3. 关键特性)
[4. 核心命令](#4. 核心命令)
[5. 典型应用](#5. 典型应用)
Redis 五种核心数据结构(String、Hash、List、Set、Sorted Set)是其高性能特性的核心载体,覆盖从简单缓存到复杂业务场景的需求。以下从核心定义、底层实现、关键特性、核心命令、典型应用五个维度,进行结构化知识点梳理,便于快速理解与记忆。
一、String(字符串):最基础的键值存储
1. 核心定义
- Redis 最基础的数据结构,对外表现为"键-值"对,值支持字符串、整数(64位有符号)、浮点数、二进制数据(如图片流)。
- 是构建复杂功能的"原子单元",其他数据结构的元素本质也多为 String 类型。
2. 底层实现
依赖 SDS(Simple Dynamic String,动态字符串) 结构,解决 C 语言原生字符串缺陷,编码随值的类型/长度动态切换:
|----------|---------------------------|------------------------------------|
| 编码类型 | 适用场景 | 核心优势 |
| int
| 值为 64 位有符号整数 | 直接存整数,支持 INCR
/DECR
原子操作,内存占用最小 |
| embstr
| 字符串长度 ≤ 44 字节(Redis 6.0+) | 键对象与 SDS 数据同块内存,减少碎片 |
| raw
| 字符串长度 > 44 字节 | 键与 SDS 分开存储,支持动态扩容,适合长字符串 |
3. 关键特性
- 操作性能:所有操作(增删改查)均为 O(1) 时间复杂度。
- 功能扩展:支持整数原子增减、字符串拼接/截取、二进制安全存储。
4. 核心命令
|-----------------------------|------------------|--------------------------------|
| 命令 | 功能 | 示例 |
| SET key value [EX 秒] [NX]
| 设置键值(可选过期/不存在才设) | SET user:name Alice EX 3600
|
| GET key
| 获取值 | GET user:name
|
| INCR/DECR key
| 整数原子加/减 1 | INCR user:age
|
| APPEND key value
| 字符串拼接 | APPEND user:info " gender:女"
|
5. 典型应用
- 缓存热点数据(如商品详情、用户信息);
- 计数器(文章阅读量、接口调用次数);
- 分布式锁(基于
SET NX EX
实现); - Session 存储(分布式系统跨服务共享)。
二、Hash(哈希):键值对的集合
1. 核心定义
- 二级结构:"键-(字段 field - 值 value)",一个 Hash 键可包含多个 field-value 对,适合存储多属性的复杂对象。
2. 底层实现
随"字段数量"和"字段值大小"动态切换编码,平衡内存与性能:
|------------------|--------------------------------|--------------------------|
| 编码类型 | 适用场景 | 核心优势 |
| ziplist(压缩列表)
| 字段数 ≤ 512(默认)+ 字段值 ≤ 64 字节(默认) | 连续内存存储,无指针开销,内存利用率极高 |
| hashtable(哈希表)
| 字段数 > 512 或字段值 > 64 字节 | 数组+链表解决哈希冲突,支持 O(1) 快速查询 |
3. 关键特性
- 操作粒度:可单独操作某个 field(增删改查),无需修改整个 Hash;
- 性能:单个 field 操作 O(1),遍历所有 field 操作 O(n)(n 为字段数)。
4. 核心命令
|------------------------|---------------------|-----------------------------------|
| 命令 | 功能 | 示例 |
| HSET key field value
| 设置 field-value 对 | HSET user:100 name Alice age 25
|
| HGET key field
| 获取指定 field 的值 | HGET user:100 name
|
| HMGET key f1 f2
| 批量获取 field 值 | HMGET user:100 name age
|
| HKEYS/HVALS key
| 获取所有 field/所有 value | HKEYS user:100
|
| HDEL key field
| 删除指定 field | HDEL user:100 age
|
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. 核心命令
|------------------------|------------------------|-------------------------------|
| 命令 | 功能 | 示例 |
| LPUSH/RPUSH key val
| 头部/尾部插入元素 | LPUSH msg:queue "hello"
|
| LPOP/RPOP key
| 头部/尾部删除元素 | RPOP msg:queue
|
| LRANGE key start end
| 获取 [start, end] 区间元素 | LRANGE msg:queue 0 -1
(所有元素) |
| LLEN key
| 获取列表长度 | LLEN msg:queue
|
5. 典型应用
- 消息队列(基于
LPUSH + RPOP
实现简单 FIFO 队列); - 最新列表(如"最新文章""最近评论",
LPUSH
新增 +LRANGE
取前 N); - 栈(基于
LPUSH + LPOP
实现 LIFO 栈)。
四、Set(集合):无序的唯一字符串集合
1. 核心定义
- 无序、元素唯一的字符串集合,支持交集、并集、差集等集合运算,适合"去重"和"关系计算"。
2. 底层实现
随元素类型和数量动态切换编码:
|------------------|-------------------------|------------------------------------|
| 编码类型 | 适用场景 | 核心优势 |
| intset(整数集合)
| 所有元素为整数 + 元素数 ≤ 512(默认) | 紧凑存储,支持整数自动升级(16位→32位→64位),无哈希开销 |
| hashtable(哈希表)
| 元素含非整数或元素数 > 512 | 以元素为键、值为 NULL
,利用哈希表唯一性去重,O(1) 操作 |
3. 关键特性
- 唯一性:自动去重,重复插入元素会被忽略;
- 集合运算:支持交集(
SINTER
)、并集(SUNION
)、差集(SDIFF
); - 性能:插入/删除/判断元素存在 O(1),集合运算 O(n)(n 为元素总数)。
4. 核心命令
|-----------------------------|----------|-----------------------------------|
| 命令 | 功能 | 示例 |
| SADD key member
| 添加元素 | SADD user:100:tags sports music
|
| SMEMBERS key
| 获取所有元素 | SMEMBERS user:100:tags
|
| SISMEMBER key member
| 判断元素是否存在 | SISMEMBER user:100:tags sports
|
| SINTER/SUNION/SDIFF k1 k2
| 交集/并集/差集 | SINTER user1:tags user2:tags
|
| SREM key member
| 删除元素 | SREM user:100:tags music
|
5. 典型应用
- 数据去重(如用户点赞的文章 ID、去重的日志 ID);
- 关系计算(社交场景的"共同好友""好友推荐");
- 标签系统(商品标签、用户兴趣标签,支持多标签筛选)。
五、Sorted Set(有序集合):按分数排序的唯一集合
1. 核心定义
- 在 Set"元素唯一"的基础上,为每个元素分配分数(score),按分数自动排序,支持按分数范围/排名查询,是 Redis 功能最强大的结构之一。
2. 底层实现
随元素数量和元素大小动态切换编码:
|------------------------|---------------------------------|---------------------------------------------------------------------------------------|
| 编码类型 | 适用场景 | 核心优势 |
| ziplist(压缩列表)
| 元素数 ≤ 128(默认)+ 元素长度 ≤ 64 字节(默认) | 按"member→score"交替存储,分数升序,内存紧凑 |
| skiplist + hashtable
| 元素数 > 128 或元素长度 > 64 字节 | - 跳表(skiplist):按 score 排序,O(log n) 范围/排名查询; - 哈希表:映射 member→score,O(1) 查改 score,保证唯一性 |
3. 关键特性
- 有序性:按 score 升序排列,支持降序查询(
ZREVRANGE
); - 排名功能:可获取元素的排名(
ZRANK
/ZREVRANK
),或按排名取元素; - 性能:插入/删除/查改 score 均为 O(log n)。
4. 核心命令
|---------------------------------------|---------------|-----------------------------------|
| 命令 | 功能 | 示例 |
| ZADD key score member
| 添加元素(指定分数) | ZADD rank:score 95 Alice 88 Bob
|
| ZRANGE/ZREVRANGE k s e [WITHSCORES]
| 升序/降序取元素(带分数) | ZREVRANGE rank:score 0 0
(第一名) |
| ZSCORE key member
| 获取元素分数 | ZSCORE rank:score Alice
|
| ZRANK/ZREVRANK key member
| 升序/降序排名 | ZREVRANK rank:score Alice
|
| ZRANGEBYSCORE k min max
| 按分数范围取元素 | ZRANGEBYSCORE rank:score 80 90
|
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)(增删查排) |