redis 面试可能会问的问题

一、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 只适合简单缓存。

总结(面试答题技巧)

  1. 结合实战:回答每个问题时,尽量关联你的代码(比如 "我用 Redis List 的 BRPOP 实现消息队列,解决了下单异步处理的问题");
  2. 先讲核心,再讲细节 :比如答分布式锁,先讲SET NX EX,再讲坑和优化;
  3. 避坑提示:新手不用死记所有细节,重点掌握和你的实战相关的场景(分布式锁、消息队列、限流、Session 共享),这些是面试高频且你有代码经验的点。
相关推荐
a9511416425 分钟前
Go 中通过 channel 传递切片时的数据竞争与深拷贝解决方案
jvm·数据库·python
qq_1898070312 分钟前
如何修改RAC数据库名_NID工具在集群环境下的改名步骤
jvm·数据库·python
aXin_ya22 分钟前
Redis 高级篇(最佳实践)
数据库·redis·缓存
码农学院22 分钟前
net针对redis的Hash操作
redis·bootstrap·哈希算法
zhangchaoxies34 分钟前
如何检测SQL注入风险_利用模糊测试技术发现漏洞
jvm·数据库·python
zhangchaoxies1 小时前
CSS如何实现响应式弹性网格布局_配合media query修改flex-wrap属性
jvm·数据库·python
霖霖总总1 小时前
[Redis小技巧32]Redis分布式锁的至暗时刻:从原理演进到时钟跳跃的终极博弈
数据库·redis·分布式
我叫黑大帅2 小时前
为什么TCP是三次握手?
后端·网络协议·面试
Polar__Star2 小时前
C#怎么操作Chart图表控件 C#如何用WinForms Chart控件绑定数据绘制统计图表【控件】
jvm·数据库·python
2401_897190552 小时前
CSS如何制作数字滚动效果_利用transform位移数字
jvm·数据库·python