Java面试现场:Spring Boot+Redis+MySQL在电商场景下的技术深度剖析

Java面试现场:Spring Boot+Redis+MySQL在电商场景下的技术深度剖析

面试场景设定

面试官 :某互联网大厂技术专家,严肃专业 面试者 :谢飞机,自称"三年经验"的Java程序员,技术基础一般但性格幽默 业务场景:大型电商平台-商品详情页系统优化


第一轮:基础架构与业务理解

问题1:电商商品详情页系统,你会如何设计技术架构?

面试官:谢飞机,假设我们要设计一个日PV千万级的电商商品详情页系统,你会选择哪些技术组件?

谢飞机:呃...这个简单!用Spring Boot做Web框架,MySQL存商品数据,Redis做缓存,Nginx做负载均衡,完美!

面试官:(点头)基础思路正确。那为什么选择Spring Boot而不是其他框架?

谢飞机:因为...Spring Boot配置简单啊,自动装配,starter依赖,写起来快!

面试官:不错,确实开发效率高。那MySQL表结构你会怎么设计?

问题2:商品数据表设计需要考虑哪些因素?

谢飞机:就一个商品表呗,id、name、price、description这些字段。

面试官:考虑过字段类型优化吗?比如价格用什么类型?

谢飞机:用double啊,小数嘛!

面试官:(皱眉)电商场景用double会有精度问题,建议用DECIMAL(10,2)。还有,大文本字段如何处理?

谢飞机:啊...这个...存MySQL的TEXT类型?

问题3:如何应对高并发读取?

面试官:日PV千万,峰值QPS可能达到几千,怎么优化?

谢飞机:加Redis缓存!把商品信息都缓存起来。

面试官:缓存策略呢?缓存穿透、缓存击穿、缓存雪崩怎么解决?

谢飞机:(挠头)这个...加个过期时间?用布隆过滤器?具体...记不太清了。


第二轮:缓存与性能优化

问题4:Redis缓存具体如何设计?

面试官:说说你的Redis键设计和使用方案。

谢飞机:key就用"product:" + 商品ID,value存JSON字符串。

面试官:JSON序列化用什么库?考虑过序列化性能吗?

谢飞机:Jackson吧,大家都用这个。性能...应该还行?

面试官:Jackson确实不错。那缓存过期时间设多久?

谢飞机:设个5分钟?10分钟?

问题5:如何保证缓存与数据库的一致性?

面试官:商品价格更新后,怎么确保缓存是最新的?

谢飞机:更新数据库后删掉缓存?或者...更新缓存?

面试官:具体方案?先更新数据库还是先删除缓存?

谢飞机:(支支吾吾)这个...好像有两种方案,具体区别记不清了...

问题6:除了Redis,还有哪些性能优化手段?

面试官:考虑过CDN、页面静态化吗?

谢飞机:CDN知道,就是把静态资源放到边缘节点。页面静态化...是不是生成HTML文件?

面试官:对的。商品详情页变化不频繁,可以考虑静态化+增量更新。


第三轮:深入技术与异常处理

问题7:如何设计商品库存扣减?

面试官:秒杀场景下,库存扣减要注意什么?

谢飞机:用Redis原子操作?decrement命令?

面试官:Redis的decrement是原子性的,但还要考虑后续的订单创建等操作,需要分布式事务。

谢飞机:分布式事务...用Seata?或者消息队列?

问题8:系统监控怎么做?

面试官:如何监控这个系统的健康状态?

谢飞机:用Spring Boot Actuator?看日志?

面试官:Actuator可以,还要结合Prometheus监控指标,Grafana做仪表盘。关键指标包括QPS、响应时间、错误率等。

问题9:遇到缓存宕机怎么办?

面试官:如果Redis集群整个宕机,系统如何降级?

谢飞机:这个...直接读数据库?但数据库可能扛不住啊...

面试官:需要有熔断机制,本地缓存作为二级缓存,限流保护数据库。


面试结束

面试官:好的,今天的面试就到这里。你的基础概念掌握得还可以,但在分布式系统、高并发场景下的实战经验还需要加强。回去等我们HR的通知吧。

谢飞机:谢谢面试官!我会继续学习的!


技术知识点详解与答案

问题1答案:电商商品详情页架构设计

业务场景:电商商品详情页需要承受高并发读取,要求响应快、可用性高。

技术方案

  • Spring Boot:快速开发,自动配置,内嵌Tomcat
  • MySQL:商品主数据存储,采用InnoDB引擎
  • Redis集群:缓存热点商品数据,减少数据库压力
  • Nginx:负载均衡,静态资源缓存
  • CDN:图片、CSS、JS等静态资源加速
  • 消息队列:异步处理数据更新

问题2答案:商品表设计优化

业务需求:商品信息包含基础属性、扩展属性、富文本描述等

技术细节

sql 复制代码
CREATE TABLE product (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(200) NOT NULL COMMENT '商品名称',
    price DECIMAL(10,2) NOT NULL COMMENT '价格',
    -- 使用DECIMAL避免浮点数精度问题
    stock INT NOT NULL DEFAULT 0 COMMENT '库存',
    description TEXT COMMENT '商品描述',
    -- 大文本单独存储,避免影响主表查询性能
    status TINYINT NOT NULL DEFAULT 1 COMMENT '状态',
    create_time DATETIME NOT NULL,
    update_time DATETIME NOT NULL,
    INDEX idx_status (status),
    INDEX idx_update_time (update_time)
) ENGINE=InnoDB CHARSET=utf8mb4;

问题3答案:高并发缓存策略

缓存设计

  • Redis键设计product:{id}product:detail:{id}
  • 缓存时间:5-30分钟,根据商品更新频率调整
  • 序列化:Jackson配置优化,避免循环引用

缓存问题解决方案

  • 缓存穿透:布隆过滤器+空值缓存
  • 缓存击穿:互斥锁+热点数据永不过期
  • 缓存雪崩:随机过期时间+集群部署

问题4答案:Redis详细配置

Spring Boot配置

yaml 复制代码
spring:
  redis:
    host: redis-cluster
    port: 6379
    password: ${REDIS_PASSWORD}
    lettuce:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 0

缓存注解使用

java 复制代码
@Cacheable(value = "product", key = "#id")
public Product getProductById(Long id) {
    return productMapper.selectById(id);
}

@CacheEvict(value = "product", key = "#product.id")
public void updateProduct(Product product) {
    productMapper.updateById(product);
}

问题5答案:缓存一致性方案

常用方案

  1. 先更新数据库,再删除缓存(推荐)
  2. 先删除缓存,再更新数据库
  3. 基于binlog的异步更新( Canal + MQ )

最终一致性保障

  • 重试机制
  • 消息队列确保操作最终执行
  • 版本号或时间戳判断数据新鲜度

问题6答案:多级缓存架构

完整缓存体系

  1. 浏览器缓存:静态资源Cache-Control
  2. CDN缓存:全球加速
  3. Nginx缓存:反向代理缓存
  4. Redis缓存:应用层缓存
  5. 本地缓存:Caffeine/Guava Cache
  6. 数据库缓存:InnoDB Buffer Pool

问题7答案:库存扣减方案

秒杀库存设计

java 复制代码
// Redis Lua脚本保证原子性
String script = "if redis.call('get', KEYS[1]) >= ARGV[1] then " +
               "return redis.call('decrby', KEYS[1], ARGV[1]) " +
               "else return -1 end";

// 预扣库存
Long result = redisTemplate.execute(
    new DefaultRedisScript<>(script, Long.class),
    Collections.singletonList("stock:" + productId),
    String.valueOf(quantity)
);

分布式事务

  • TCC模式:Try-Confirm-Cancel
  • Saga模式:事件驱动的补偿事务
  • 本地消息表:最终一致性

问题8答案:系统监控体系

监控指标

  • 应用层:QPS、响应时间、错误率、JVM内存
  • 缓存层:命中率、内存使用、连接数
  • 数据库层:慢查询、连接数、锁等待
  • 系统层:CPU、内存、磁盘、网络

技术栈

  • Spring Boot Actuator + Micrometer
  • Prometheus 数据采集
  • Grafana 数据可视化
  • ELK 日志分析

问题9答案:容灾降级方案

缓存宕机应对

  1. 本地缓存:Caffeine二级缓存
  2. 限流保护:Sentinel或Hystrix
  3. 降级策略:返回默认数据或错误页面
  4. 熔断机制:防止雪崩效应

系统健壮性设计

  • 集群部署,多可用区
  • 自动故障转移
  • 容量规划和弹性伸缩

总结

通过这个电商商品详情页的面试场景,我们涵盖了Java开发中的多个重要技术点:Spring Boot应用开发、MySQL数据库设计、Redis缓存策略、高并发处理、分布式事务、系统监控等。这些技术在实际互联网项目中都是必备技能,建议开发者深入理解每个技术点的原理和最佳实践。

对于面试者来说,不仅要掌握技术概念,更要理解业务场景下的技术选型和架构设计思路。这样才能在真正的项目开发中做出合理的技术决策。

相关推荐
杨运交11 分钟前
[041][公共模块]分布式唯一ID生成器设计与实现:一款灵活可扩展的雪花算法框架
spring boot
用户30745969820716 小时前
Redis 延时队列详解
redis
烤代码的吐司君18 小时前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
Flittly1 天前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
Flynt2 天前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
唐青枫2 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
小满8782 天前
5.Mysql事务隔离级别与锁机制
mysql
元Y亨H3 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
掉鱼的猫3 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
leeyi3 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent