腾讯面试官经常问的问题:Redis 为什么能快到飞起?搞懂这 5 种核心数据结构,你就掌握了 Redis 高性能的秘密!
🚀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: TomRedis:
SET user:name Tom获取:
GET user:name结果:
Tom2. String 能存什么?
不仅仅是字符串。
还可以存:
数字
例如:
SET count100增加:
INCR count结果:
101JSON对象
例如:
{"id":1,"name":"Tom"}转换成字符串存储。
String 应用场景
1. 缓存
例如:
数据库:
MySQL 用户信息缓存:
Redis user:1001查询:
请求 ↓ Redis ↓ 没有 ↓ MySQL2. 计数器
例如:
文章点赞:
INCR article:like:10013. 分布式锁
例如:
SET lock:user:1trueNX EX10二、Hash:存储对象
1. 什么是 Hash?
Hash 类似:
Java 中:
Map<String,Object>例如用户:
user:1001 name = Tom age = 20 address = BeijingRedis:
HSET user:1001 name Tom HSET user:1001 age20查询:
HGET user:1001 name返回:
TomHash 应用场景
存储对象信息
例如:
用户:
{"name":"Tom","age":20}可以:
Redis Hash user:1001 name Tom age 20优点:
修改一个字段:
不用重新存整个对象。
三、List:列表结构
1. 什么是 List?
List:
类似 Java:
LinkedList特点:
- 有序
- 可重复
例如:
A B CRedis:
左边插入:
LPUSH list A右边弹出:
RPOP listList 应用场景
1. 消息队列
例如:
生产者:
订单服务 ↓ Redis List ↓ 消费者流程:
生产消息 LPUSH 消费消息 RPOP2. 最新消息列表
例如:
微博:
最新动态。
四、Set:无序集合
1. 什么是 Set?
Set:
类似 Java:
HashSet特点:
- 无序
- 不重复
例如:
用户标签: Java Redis Spring添加:
SADD user:tag JavaSet 应用场景
1. 去重
例如:
统计访问用户:
user1 user2 user1Set:
自动去重。
2. 共同好友
例如:
用户A:
张三 李四 王五用户B:
李四 王五 赵六求共同好友:
SINTER userA userB结果:
李四 王五五、ZSet:有序集合(重点)
1. 什么是 ZSet?
ZSet:
Sorted Set。
特点:
有序 + 不重复。
它比 Set 多一个:
score(分数)
例如排行榜:
用户 分数 Tom 100 Jack 90 Lucy 80Redis:
ZADD rank100Tom查询排名:
ZRANGE rank010ZSet 应用场景
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% 的日常使用场景。
