🚀 Redis 为什么能快到飞起?搞懂这 5 种核心数据结构,你就掌握了 Redis 高性能的秘密!
很多 Java 后端开发者都会使用 Redis:
redisTemplate.opsForValue().set("user:1", user);
但是面试官继续问:
Redis 有哪些数据结构?底层为什么这么设计?分别适用于什么场景?
很多人只能回答:
String、List、Set、Hash、ZSet。
这个答案只能拿基础分。
真正理解 Redis,需要知道:
- 每种数据结构解决什么问题?
- 什么时候使用?
- 底层为什么快?
今天一篇文章彻底搞懂 Redis 五大核心数据结构。
一、Redis 为什么这么快?
在了解数据结构之前,先理解 Redis 的设计思想。
Redis 高性能主要来自:
1. 基于内存存储
传统数据库:
磁盘
↓
读取数据
速度较慢。
Redis:
内存
↓
直接访问
速度非常快。
2. 单线程事件模型
Redis 核心命令执行采用单线程:
请求1
请求2
请求3
↓
Redis线程依次执行
避免:
- 线程切换
- 锁竞争
3. 高效的数据结构
Redis 没有简单使用 Java 集合。
而是自己设计:
- SDS
- ziplist
- quicklist
- skiplist
等底层结构。
二、Redis 五大基本数据结构
Redis 常用数据结构:
| String | 字符串 | 缓存、计数器 |
| Hash | 键值对集合 | 对象存储 |
| List | 列表 | 消息队列 |
| Set | 无序集合 | 标签、去重 |
| ZSet | 有序集合 | 排行榜 |
下面详细介绍。
一、String:最常用的数据结构
1. 什么是 String?
String:
就是字符串类型。
例如:
key:
user:name
value:
Tom
Redis:
SET user:name Tom
获取:
GET user:name
结果:
Tom
2. String 能存什么?
不仅仅是字符串。
还可以存:
数字
例如:
SET count 100
增加:
INCR count
结果:
101
JSON对象
例如:
{
"id":1,
"name":"Tom"
}
转换成字符串存储。
String 应用场景
1. 缓存
例如:
数据库:
MySQL
用户信息
缓存:
Redis
user:1001
查询:
请求
↓
Redis
↓
没有
↓
MySQL
2. 计数器
例如:
文章点赞:
INCR article:like:1001
3. 分布式锁
例如:
SET lock:user:1 true NX EX 10
二、Hash:存储对象
1. 什么是 Hash?
Hash 类似:
Java 中:
Map<String,Object>
例如用户:
user:1001
name = Tom
age = 20
address = Beijing
Redis:
HSET user:1001 name Tom
HSET user:1001 age 20
查询:
HGET user:1001 name
返回:
Tom
Hash 应用场景
存储对象信息
例如:
用户:
{
"name":"Tom",
"age":20
}
可以:
Redis Hash
user:1001
name Tom
age 20
优点:
修改一个字段:
不用重新存整个对象。
三、List:列表结构
1. 什么是 List?
List:
类似 Java:
LinkedList
特点:
- 有序
- 可重复
例如:
A
B
C
Redis:
左边插入:
LPUSH list A
右边弹出:
RPOP list
List 应用场景
1. 消息队列
例如:
生产者:
订单服务
↓
Redis List
↓
消费者
流程:
生产消息
LPUSH
消费消息
RPOP
2. 最新消息列表
例如:
微博:
最新动态。
四、Set:无序集合
1. 什么是 Set?
Set:
类似 Java:
HashSet
特点:
- 无序
- 不重复
例如:
用户标签:
Java
Redis
Spring
添加:
SADD user:tag Java
Set 应用场景
1. 去重
例如:
统计访问用户:
user1
user2
user1
Set:
自动去重。
2. 共同好友
例如:
用户A:
张三
李四
王五
用户B:
李四
王五
赵六
求共同好友:
SINTER userA userB
结果:
李四
王五
五、ZSet:有序集合(重点)
1. 什么是 ZSet?
ZSet:
Sorted Set。
特点:
有序 + 不重复。
它比 Set 多一个:
score(分数)
例如排行榜:
用户 分数
Tom 100
Jack 90
Lucy 80
Redis:
ZADD rank 100 Tom
查询排名:
ZRANGE rank 0 10
ZSet 应用场景
1. 排行榜
例如:
游戏排名:
玩家积分排行榜
2. 热门文章
文章:
score:
代表:
阅读量。
六、Redis 数据结构底层实现
面试高级问题:
Redis 五种数据结构底层是什么?
String
底层:
SDS:
(Simple Dynamic String)
优势:
- 获取长度快
- 二进制安全
- 扩容方便
Hash
底层:
根据数据量:
可能使用:
- ziplist
- listpack
- hash table
List
底层:
以前:
ziplist
后来:
quicklist
Set
底层:
- hash table
- intset
ZSet
底层:
- skiplist(跳表)
- hash table
七、Redis 常见数据结构选择
实际开发:
| 缓存对象 | String / Hash |
| 计数 | String |
| 点赞数量 | String |
| 用户信息 | Hash |
| 消息队列 | List |
| 去重统计 | Set |
| 共同好友 | Set |
| 排行榜 | ZSet |
| 热点排行 | ZSet |
八、面试最终回答
如果面试官问:
Redis 有哪些数据结构?
可以这样回答:
Redis 常用的数据结构主要有五种:String、Hash、List、Set 和 ZSet。String 常用于缓存和计数器;Hash 适合存储对象;List 可以实现消息队列;Set 用于去重和集合运算;ZSet 通过 score 实现排序,常用于排行榜。Redis 底层针对不同场景设计了 SDS、HashTable、QuickList、SkipList 等高效结构,因此能够实现高性能的数据访问。
最后一句话记忆:
String:存一个值
Hash:存一个对象
List:存一串数据
Set:存不重复数据
ZSet:带排名的数据
掌握这五种数据结构,你就掌握了 Redis 80% 的日常使用场景。



