项目用Redis做了什么?
                           
天天向上
发布: 2025-04-20 20:02:06

原创
725 人浏览过

这是后端开发面试中非常常见的一个问题,考察你对 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 的场景非常多,核心用途包括:

  1. 数据缓存:用户信息、商品详情等使用 Redis 做缓存,使用统一封装的缓存服务,支持自动失效与预热,减少 DB 压力。
  2. 分布式锁:在订单创建、库存扣减等高并发场景中使用 Redis 锁控制并发,避免数据不一致。
  3. 限流与验证码:登录接口、验证码接口做了 IP 和用户 ID 的限流,验证码也存在 Redis 中设置 5 分钟过期。
  4. 异步队列:部分操作如发送短信邮件,我们使用 Redis 的 List 做简单的任务队列。
  5. Token 管理:用户登录的 token 状态保存在 Redis 中,做到了分布式部署下的登录共享。

此外我们对 Redis Key 命名做了统一规范,并配置了缓存预热与监控机制。”

发表回复 0

Your email address will not be published. Required fields are marked *