2026/2/17 3:04:46
网站建设
项目流程
公司网站用什么程序,wordpress站演示,正规网站建设公司哪个比较好,网站备案信息下载基于SpringBoot的汉服租赁系统毕设#xff1a;高效率开发与性能优化实战 一、背景痛点#xff1a;毕设里那些“跑不动”的代码
去年辅导学弟做汉服租赁系统#xff0c;初版一上线就卡成 PPT#xff1a;首页加载 5 s、下单接口 3 s、并发 20 就 502。我把代码拉下来一看高效率开发与性能优化实战一、背景痛点毕设里那些“跑不动”的代码去年辅导学弟做汉服租赁系统初版一上线就卡成 PPT首页加载 5 s、下单接口 3 s、并发 20 就 502。我把代码拉下来一看典型“学生味道”十足订单列表 for 循环查用户、查库存N1 查询把数据库堵死支付回调用 Thread.sleep 轮询同步阻塞把 Tomcat 线程池吃光每个 Controller 里 copy 同一套参数校验重复代码上千行库存字段无索引where costume_id ? 全表扫描 3 万条记录这些问题不解决功能再花哨也扛不住答辩现场的“多用户演示”。于是我把优化目标拆成两条开发效率——一周迭代一个版本运行效率——接口 RT 200 ms、并发 200 无错误。下面把完整踩坑与提速过程按模块摊开方便直接抄作业。二、技术选型为什么不是 JPA、不是 MemcachedSpringBoot脚手架最成熟IDEA 一键生成插件市场丰富省掉 70% 配置MyBatis-Plus比 JPA 更直观写复杂 SQL 不头疼内置分页、乐观锁、主键自动生成减少重复代码Redis单线程模型Lua 脚本保证原子性库存扣减比 MySQL 行锁轻量支持 key 过期天然防缓存穿透放弃 Memcached 的原因数据结构单一无法执行 Lua放弃 JPA 的原因懒加载容易 N1调优需要改全局 fetch 策略对学生不友好一句话总结让每一行代码都“看得见 SQL、看得见缓存”出了问题能 5 分钟内定位。三、核心实现三个高频场景的效率改造3.1 订单创建的幂等性设计需求用户双击“立即租赁”不会重复下单。方案前端生成 UUID后端用 Redis SETNX 做分布式锁keyorder:{userId}:{uuid}过期 5 s防止宕机死锁。流程进入 OrderService.createOrder() 先 setIfAbsent返回 false 直接抛 DuplicateSubmitException提交成功立即 deleteKey释放锁3.2 库存扣减的并发控制库存表 costume_stock 字段id、costume_id、available、version利用 MyBatis-Plus 乐观锁插件Version private Integer version;更新 SQLupdate costume_stock set available available - ?, version version 1 where costume_id ? and version ?更新返回 0 表示并发冲突后台重试 3 次仍失败则提示“库存不足”。压测 200 并发零超卖QPS 从 120 提到 950。3.3 基于 CompletableFuture 的异步通知支付成功后需发短信 2. 发邮件 3. 刷新缓存如果串行执行RT 直接 600 ms。改造CompletableFuture.allOf( smsFuture, emailFuture, cacheRefreshFuture ).orTimeout(2, TimeUnit.SECONDS);Tomcat 线程立即返回三个任务丢进自定义线程池核心 8最大 16接口 RT 稳定在 80 ms 以内。四、Clean Code 示例带注释的关键片段RestController RequiredArgsConstructor RequestMapping(/order) public class OrderController { private final OrderService orderService; private final StringRedisTemplate redisTemplate; /** * 创建订单 * 1. 防重提交 * 2. 库存扣减 * 3. 异步通知 */ PostMapping public ApiResultLong create(Valid RequestBody CreateOrderDTO dto) { // 1. 幂等校验 String key order: dto.getUserId() : dto.getUuid(); Boolean absent redisTemplate.opsForValue().setIfAbsent(key, 1, Duration.ofSeconds(5)); if (Boolean.FALSE.equals(absent)) { throw new BizException(订单已提交请勿重复点击); } // 2. 业务处理 Long orderId orderService.createOrder(dto); // 3. 异步通知 notifyAsync(dto.getMobile(), dto.getEmail(), orderId); return ApiResult.success(orderId); } private void notifyAsync(String mobile, String email, Long orderId) { CompletableFuture.runAsync(() - smsService.send(mobile, orderId)); CompletableFuture.runAsync(() - emailService.send(email, orderId)); } }Service 层同样保持“一个方法一件事”超过 20 行就继续拆读代码像读故事答辩老师一眼看懂。五、性能与安全压测、脱敏、防注入JMeter 压测场景200 线程每线程 20 次下单Ramp-up 10 s结果平均 RT 92 ms95% RT 150 ms错误率 0%服务器 CPU 占用 42%内存 1.2 GSQL 注入MyBatis-Plus 自带 #{} 预编译额外开启全局 SQL 注入过滤器阻断 union、script 关键字。敏感数据脱敏日志、返回体统一用 Jackson 脱敏序列化器JsonSerialize(using MaskSerializer.class) private String idCard;输出 371***********1234防止泄露。六、生产环境避坑指南事务边界误用在 Service 里把“库存扣减”与“消息投递”包在同一事务一旦消息队列超时回滚库存被重复恢复。解决事务只包住本地数据库消息表采用本地消息表定时任务最终一致性。Redis 缓存穿透空值也缓存设置 30 s 过期布隆过滤器预加载热门商品 ID拦截 99% 非法 key。冷启动延迟SpringBoot 默认懒加载注解扫描首次请求才加载 Bean。开启spring: main: lazy-initialization: false并在 DockerFile 里加RUN java -Dexit.on.inittrue -jar app.jar做一次预热容器启动即完成类加载用户第一次访问不再“卡顿 2 s”。线程池配置默认线程池队列无限高峰期 OOM。按“核心线程CPU 核数1队列长度200拒绝策略CallerRuns”设置宁可降级也不把内存打爆。七、写在最后毕设周期有限效率与功能如何兼得两周需求、一周联调、一周写论文是大多数本科毕设的现实。我的经验是先跑通黄金链路下单、支付、归还其余功能按“能异步就异步、能缓存就缓存”原则迭代每完成一个模块立刻写单元测试与 JMeter 脚本性能回退立即发现代码合并前强制走一遍“IDEA 代码检查阿里规约插件”把潜在 N1、空指针全扫光。汉服租赁系统虽小但把“分层缓存异步压测”这套组合拳练熟就能套用到任何高并发业务。如果你已经写完初版不妨挑最慢的一个接口按本文思路重构把 SQL 拉到控制台 explain 一下把重复代码提成公用方法把同步调用换成 CompletableFuture亲手把 RT 从 3 s 压到 100 ms 的那一刻你会对“效率”二字有真金白银的体会。祝你答辩顺利也欢迎把测试结果留言交流一起把毕设做成能上线运营的真系统。