项目用Redis做了什么?
这是后端开发面试中非常常见的一个问题,考察你对 Redis 的实际应用场景和架构理解。答好这个问题,可以展示你对缓存设计、分布式锁、限流、异步解耦、性能优化等多个方面的掌握程度。
一、简明回答模板(开头版)
“我们项目中使用 Redis 主要做了缓存加速、分布式锁、限流、消息队列和热点数据预热等优化。具体包括用户会话缓存、商品详情缓存、登录验证码缓存,以及秒杀系统中的分布式锁与请求限流等功能。”
二、Redis 在项目中的典型应用场景
1. 数据缓存(最常见)
🔹 用途:
- 缓存热点数据(如用户信息、商品详情、文章内容)
- 降低数据库压力,提高访问速度
- 支持缓存预热、缓存穿透、雪崩、击穿防护
🔹 示例代码(.NET):
var user = await _cache.GetOrCreateAsync($"user:{id}", async () => {
return await _dbContext.Users.FindAsync(id);
});
🔹 面试扩展答法:
“我们使用 Redis 缓存了用户资料、首页推荐数据等,通过设置合理过期时间 + 自动预热机制,避免缓存击穿和雪崩。”
2. 分布式锁(控制并发)
🔹 用途:
- 控制高并发操作,如秒杀、库存扣减、订单唯一提交
- Redis 中使用
SETNX + EXPIRE实现互斥锁
🔹 面试扩展答法:
“在创建订单流程中,我们使用 Redis 分布式锁,防止并发多次提交造成超卖或重复下单。”
3. 登录验证码 / 临时状态缓存
🔹 用途:
- 验证码 5 分钟有效
- 登录 token/会话缓存
- 用户登录错误次数记录
🔹 示例:
// 设置验证码,有效期5分钟
await redis.StringSetAsync("login:code:138xxxx1234", "ABCD", TimeSpan.FromMinutes(5));
4. 接口限流(防刷防爆)
🔹 用途:
- 对 IP 或用户 ID 做访问频率限制
- 简单实现使用
INCR + EXPIRE
🔹 面试答法:
“我们在短信验证码和秒杀接口上做了 Redis 限流,防止恶意刷接口、刷验证码。”
5. 异步消息队列 / 任务队列
🔹 用途:
- 使用 Redis List 实现简单队列(如发送邮件、短信、审核异步处理)
🔹 面试答法:
“部分低时效性的业务(如注册成功发送邮件),我们使用 Redis List 做异步队列处理,提高接口响应速度。”
6. 会话管理 / Token 缓存
- 使用 Redis 保存登录状态(token 或 session)
- 跨服务共享会话信息(单点登录)
7. 排行榜、点赞、浏览记录等场景
- 使用 Redis SortedSet 实现排行榜
- 使用 Hash 保存用户浏览数据
8. 秒杀场景应用(组合使用)
| 功能 | Redis 场景 |
|---|---|
| 商品库存 | String 预减库存 |
| 下单防重复 | SetNX 分布式锁 |
| 限流防刷 | INCR 限频 |
| 异步下单 | Redis List + 消费者 |
三、项目中 Redis 使用的补充点(可加分)
| 加分点 | 描述 |
|---|---|
| ✅ 使用 RedisHelper/封装类 | 便于统一管理 |
| ✅ 使用 JSON 序列化缓存对象 | 减少多次查询 |
| ✅ 使用 Key 统一前缀命名规范 | user:{id}、article:{id} |
| ✅ 缓存监控 | 配合命令查看缓存命中率 |
| ✅ 缓存预热脚本 | 发布前将热点数据加载入缓存 |
四、面试答题参考模板(完整版)
“我们项目使用 Redis 的场景非常多,核心用途包括:
- 数据缓存:用户信息、商品详情等使用 Redis 做缓存,使用统一封装的缓存服务,支持自动失效与预热,减少 DB 压力。
- 分布式锁:在订单创建、库存扣减等高并发场景中使用 Redis 锁控制并发,避免数据不一致。
- 限流与验证码:登录接口、验证码接口做了 IP 和用户 ID 的限流,验证码也存在 Redis 中设置 5 分钟过期。
- 异步队列:部分操作如发送短信邮件,我们使用 Redis 的 List 做简单的任务队列。
- Token 管理:用户登录的 token 状态保存在 Redis 中,做到了分布式部署下的登录共享。
此外我们对 Redis Key 命名做了统一规范,并配置了缓存预热与监控机制。”