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 共享),这些是面试高频且你有代码经验的点。
相关推荐
小江的记录本1 小时前
【Spring Boot】Spring Boot 全体系知识结构化拆解(附 Spring Boot 高频面试八股文精简版)
java·spring boot·后端·spring·面试·tomcat·mybatis
这辈子谁会真的心疼你1 小时前
如何修改照片定位信息?详细介绍两个方法
数据库
ssshooter1 小时前
infer,TS 类型系统的手术刀
前端·面试·typescript
Oueii1 小时前
构建一个基于命令行的待办事项应用
jvm·数据库·python
我叫黑大帅2 小时前
Js常用数组处理
前端·javascript·面试
油丶酸萝卜别吃2 小时前
springboot项目中redis常见的增删改查操作是哪些?
spring boot·redis·bootstrap
我叫黑大帅2 小时前
Js常用的字符串处理
前端·javascript·面试
gustt2 小时前
手写 Zustand:从零实现 React 轻量级状态管理库
前端·面试
小瓦码J码2 小时前
PostgreSQL pg_stat_statements 性能分析利器(二)全表扫描导致物理IO爆炸
数据库·postgresql