一、Redis 基础必问(入门门槛,必须掌握)
1. Redis 是什么?它的核心特点是什么?
回答思路:
- 定义:Redis 是基于内存的键值对数据库,支持多种数据结构,可做缓存、消息队列、分布式锁等;
- 核心特点(记 5 个):✅ 高性能:基于内存,单线程模型(避免线程切换开销),QPS 可达 10 万 +;✅ 丰富的数据结构:String/List/Hash/Set/ZSet/Stream(重点提和业务相关的 List/Stream);✅ 持久化:支持 RDB(快照)和 AOF(日志),解决内存数据丢失问题;✅ 高可用:主从复制、哨兵、集群,保证 Redis 不宕机;✅ 原子性:命令是原子的(比如 INCR、SETNX),适合做分布式锁 / 限流。
2. Redis 有哪些数据结构?分别用在什么场景?
回答思路(结合你的实战场景):
| 数据结构 | 核心场景 | 你的实战关联 |
|---|---|---|
| String | 缓存(用户信息)、限流(计数器)、Session 共享 | 限流的 INCR 计数、Session 存储 |
| List | 消息队列(LPUSH+BRPOP)、最新列表 | 消息队列的基础实现 |
| Hash | 存储对象(比如订单信息) | 替代多个 String,节省 Key |
| Set | 去重(点赞用户)、交集 / 并集(共同好友) | 点赞场景去重 |
| ZSet | 排行榜(按分数排序) | 商品销量榜、用户积分榜 |
| Stream | 高级消息队列(消费者组、消息确认) | 弥补 List 队列的不足 |
3. Redis 的持久化机制(RDB/AOF)有什么区别?
回答思路:
- RDB:定时生成内存快照(二进制文件),优点是恢复快、文件小;缺点是可能丢失快照后的数;
- AOF:记录所有写命令(日志文件),优点是数据安全性高(可配置每秒 / 每次命令刷盘);缺点是文件大、恢复慢;
- 生产建议:一般开启混合持久化(Redis 4.0+),结合 RDB 的快速恢复和 AOF 的高安全性。
4. Redis 为什么是单线程的?还能这么快?
回答思路:
- 为什么单线程:Redis 的瓶颈不在 CPU,而在内存 / 网络;单线程避免了线程切换、锁竞争的开销;
- 快的核心原因:✅ 基于内存操作,不用磁盘 IO;✅ 单线程避免上下文切换;✅ 用 IO 多路复用(epoll)处理多客户端连接;✅ 命令是原子的,不用加锁。
二、Redis 核心场景必问(和你的实战强相关)
1. 如何用 Redis 实现分布式锁?有什么坑?
回答思路(结合你的代码):
- 核心实现:
SET lockKey UUID NX EX 5(NX = 不存在才设置,EX = 自动过期防死锁,UUID 防误删); - 释放锁:用 Lua 脚本原子验证 + 删除(避免并发误删);
- 常见坑:❌ 忘记设置过期时间:服务器宕机导致死锁;❌ 直接 DEL 删除锁:没验证 UUID,删了别人的锁;❌ 过期时间太短:业务没处理完锁就失效;
- 进阶优化:用 Redisson(Redis 客户端)实现分布式锁(自动续期,解决过期时间问题)。
2. Redis 做消息队列有什么优缺点?和 RabbitMQ/Kafka 的区别?
回答思路:
- 优点:轻量(复用现有 Redis)、开发简单、性能高;
- 缺点:可靠性差(宕机可能丢消息)、不支持复杂路由、消息堆积占内存;
- 对比专业 MQ:✅ Redis:适合中小规模、非核心场景(通知、日志);✅ RabbitMQ:支持复杂路由、消息确认,适合核心业务(订单);✅ Kafka:高吞吐、支持海量消息,适合日志收集、大数据场景。
3. 如何用 Redis 实现接口限流?有几种方式?
回答思路(结合你的代码):
- 核心方式:✅ 计数器法(INCR+EXPIRE):简单,适合固定时间窗口(比如 1 分钟 5 次);✅ 滑动窗口(ZSet):解决计数器法的 "临界问题"(比如 59 秒和 0 秒各发 5 次,突破限制);✅ 令牌桶(Redis+Lua):控制流量速率(比如每秒放 10 个令牌,拿不到令牌就限流);
- 你的实战:先用计数器法落地,进阶用滑动窗口优化。
4. Redis 如何实现 Session 共享?解决了什么问题?
回答思路:
- 解决的问题:分布式部署下,多服务器 Session 不一致(用户重复登录);
- 实现方式:✅ 引入
spring-session-data-redis依赖;✅ 配置 Session 存储类型为 Redis;✅ 业务代码无需修改,HttpSession 自动同步到 Redis; - 核心原理:把 Session 从服务器本地内存搬到 Redis(所有服务器共享),通过 SessionID 关联。
三、Redis 性能 & 问题排查必问(体现实战能力)
1. Redis 缓存穿透、缓存击穿、缓存雪崩是什么?怎么解决?
回答思路(面试高频,记清楚场景 + 方案):
| 问题 | 场景 | 解决方案 |
|---|---|---|
| 缓存穿透 | 请求不存在的 Key(比如查 ID=-1 的用户),穿透到数据库 | ✅ 缓存空值;✅ 布隆过滤器拦截 |
| 缓存击穿 | 热点 Key 过期,大量请求瞬间打到数据库 | ✅ 热点 Key 永不过期;✅ 互斥锁重建缓存 |
| 缓存雪崩 | 大量 Key 同时过期,数据库被压垮 | ✅ 过期时间加随机值;✅ 主从 + 哨兵保证 Redis 高可用 |
2. Redis 的 Key 设计有什么规范?如何优化?
回答思路:
- 规范:✅ 统一前缀:
业务:模块:id(比如limit:login:1001);✅ 避免 Key 过长:比如不用全类名当 Key;✅ 避免大量小 Key:用 Hash 存储对象(比如user:1001代替user:1001:name); - 优化:✅ 设置过期时间:不用的 Key 自动删除,释放内存;✅ 拆分热点 Key:比如全局限流 Key 拆成多个子 Key,避免热点。
3. Redis 集群模式了解吗?为什么要用集群?
回答思路:
- 为什么用集群:单 Redis 内存有限(比如最多 16G),集群实现扩容(分片存储数据)+ 高可用;
- 核心特点:✅ 分片:把 Key 按哈希槽(16384 个)分配到不同节点;✅ 主从:每个节点有主从备份,主节点挂了从节点顶上;✅ 无中心:所有节点平等,客户端可连任意节点。
4. 如何排查 Redis 性能问题?(比如响应慢)
回答思路(实战技巧):
- 用
redis-cli --stat查看 QPS、内存、连接数; - 用
slowlog get查看慢查询(比如大 Key 操作、复杂命令); - 检查是否有大 Key:
bigkeys命令,大 Key 删除会阻塞 Redis; - 检查持久化:AOF 刷盘 / RDB 快照会占用 CPU,导致响应慢;
- 优化:避免用
KEYS *、HGETALL等慢命令,拆分大 Key,合理配置持久化。
四、Redis 面试加分题(体现深度)
1. Redis 的过期键是如何删除的?
回答思路:
- 惰性删除:访问 Key 时才检查是否过期,过期则删除(节省 CPU);
- 定期删除:Redis 每隔一段时间,随机抽查部分过期 Key 删除(避免内存泄漏);
- 内存淘汰:内存满时,按策略淘汰 Key(比如 LRU:淘汰最近最少使用的 Key)。
2. Redisson 是什么?和原生 Redis 有什么区别?
回答思路:
- Redisson 是 Redis 的 Java 客户端,封装了分布式锁、限流器、队列等高级功能;
- 优势:✅ 分布式锁自动续期(解决过期时间太短的问题);✅ 提供丰富的 API(比如 RLock、RRateLimiter),不用自己写 Lua 脚本;✅ 支持分布式集合(比如 RMap、RList)。
3. Redis 和 Memcached 有什么区别?为什么选 Redis?
回答思路:
- 数据结构:Memcached 只支持 String,Redis 支持多种;
- 持久化:Memcached 不支持,Redis 支持 RDB/AOF;
- 高可用:Memcached 不支持集群,Redis 支持主从 / 哨兵 / 集群;
- 原子性:Redis 命令原子性,适合分布式场景;
- 结论:Redis 功能更全面,能覆盖缓存、分布式锁、消息队列等场景,Memcached 只适合简单缓存。
总结(面试答题技巧)
- 结合实战:回答每个问题时,尽量关联你的代码(比如 "我用 Redis List 的 BRPOP 实现消息队列,解决了下单异步处理的问题");
- 先讲核心,再讲细节 :比如答分布式锁,先讲
SET NX EX,再讲坑和优化; - 避坑提示:新手不用死记所有细节,重点掌握和你的实战相关的场景(分布式锁、消息队列、限流、Session 共享),这些是面试高频且你有代码经验的点。