当前位置: 首页 > news >正文

【技术底稿 39】自测阶段看不下去:一次缓存 + MyBatis-Plus 联合性能改造

一、背景:还没上线,我自己先受不了了

项目还在自测阶段,功能刚跑通,按理说性能可以先放一放。

但我自己测着测着,实在忍不下去了:

  • 用户登录一次:近300ms

  • 字典树第一次:2.5s

  • 字典树第二次:3.7s(缓存完全失效,越查越慢)

这要是上线,前端同学绝对天天来敲门。

再加一个硬性要求:必须兼容国产化数据库(达梦、人大金仓)。原来一堆 MyBatis XML 联表查询、统计 SQL,到时候适配能改到崩溃。

于是我决定:上线前,主动把性能和代码结构一起盘一遍。


二、整体改造方案

两条线并行,互不冲突,只做增量优化,不推翻重来:

改造线目标覆盖模块
MyBatis-Plus 改造简化 CRUD、干掉冗余 XML、兼容国产数据库用户、字典、权限、菜单、项目、里程碑、成果、成员、文件、邀请、论坛
缓存体系改造降低延迟、减轻 DB 压力、解决字典树巨慢问题用户、字典、角色/权限、资源菜单、人员组织类型

三、MyBatis-Plus 改造:干掉 80% 的 MyBatis XML

3.1 为什么要改
  • 每个表都写 XML,简单 CRUD 也要手写 SQL

  • 复杂查询、统计、联表全堆在一起,维护爆炸

  • 后续要适配达梦、人大金仓,MP 兼容性远优于原生 MyBatis

3.2 改造策略(非常关键)

不是一刀切,而是二八原则:

  • 80%单表 CRUD、分页、条件查询 → 交给 MP

  • 20%复杂联表、递归、统计 → 保留 XML

这次一共迁移 7 个核心模块:项目、里程碑、成果、项目成员、文件、邀请、论坛。

3.3 踩坑记录(真实!)

改造时漏了一个统计方法countByProjectId,编译不报错,但运行结果不对。

解决方案:把 XML 里所有 SQL 过一遍,确保要么被 MP 覆盖,要么明确保留。


四、缓存体系改造:从 3.7s → 100ms

4.1 问题有多严重
场景耗时
用户登录~300ms
字典树首次2.5s
字典树二次3.7s(缓存不生效,反而更慢)
4.2 改造方案
模块缓存策略效果
用户信息Redis + 主动清理登录 ↓66%
字典树Redis + Gzip 压缩二次请求 ↓97%
角色/权限Redis + 实时更新变更立即生效
资源菜单Redis 缓存菜单加载加速
组织类型Redis 12h 过期减少 DB 查询
4.3 字典树巨慢的真凶:大 JSON 反序列化

字典树结构复杂,JSON 体积巨大。从 Redis 读出来后,光解析就要几秒钟。

最终方案:Gzip 压缩存储——体积减少约70%,反序列化开销直接消失。

4.4 缓存预热(细节拉满)

服务启动就自动加载常用数据,不让第一个用户等待。

@Component @RequiredArgsConstructor public class CachePreheater { private final SysDictService dictService; private final ResourceService resourceService; private final RoleService roleService; @EventListener(ApplicationReadyEvent.class) public void preheat() { CompletableFuture.runAsync(() -> { dictService.getDictTree(); resourceService.getAllVisibleMenus(); roleService.getByRoleCode("manager"); }); } }

五、顺手修复的小问题

问题解决方案
角色多选过滤UserQuery 增加roleCodes
统计方法遗漏恢复countByProjectId等 SQL
审批状态更新改用 MPLambdaUpdateWrapper
PageResult.empty()泛型缺失补充泛型方法,代码清爽

六、最终性能成果(数据说话)

场景优化前优化后
用户登录~300ms~100ms
字典树首次2.5s1s
字典树二次3.7s100ms
项目列表每次 JOIN 查库缓存 + MP 分页

自测阶段就把坑全部填平,上线后安安心心。


七、待办(后续规划)

任务优先级说明
项目名称缓存目前还是实时查库
批量分享话题优化使用频率不高,先不动
国产化数据库兼容测试待排期MP 已铺好路,等环境到位

八、文末总结

此文由自测阶段主动发起的性能优化实战整理而成,从字典树 3.7s、登录 300ms 的性能痛点切入,逐步落地 MyBatis-Plus 精简改造与 Redis 缓存优化,梳理出一套 “不推翻重来、增量优化” 的实战方案。

全文收录 MyBatis-Plus 改造技巧、Redis 缓存优化(含 Gzip 压缩、缓存预热)、真实踩坑复盘及性能对比数据,覆盖国产化数据库适配前置准备,属于后端开发刚需性能优化干货。


《技术底稿》系列第 39 篇,收藏留存,上线前性能优化、MyBatis-Plus 迁移、缓存体系搭建可直接照搬参考,提前排坑,避免上线后被动运维。

http://www.cnnetsun.cn/news/2481035.html

相关文章:

  • 从‘盲猜’到‘先知’:深度解读神经RRT*如何让采样规划拥有‘大局观’
  • 别再傻傻用for循环了!英飞凌TC3X7的STM定时器,这样写延时函数才专业
  • 运筹优化入门:手把手教你用YALMIP+CPLEX在MATLAB里解第一个线性规划问题
  • 测试工程师的人生规划:如何平衡测试工作和生活
  • VAP特效动画实战指南:3步掌握跨平台高性能动画制作
  • Linux服务器CUDA Toolkit安装避坑指南:从驱动兼容性检查到环境变量永久生效
  • Linux内核reset子系统:统一硬件复位管理的核心框架与驱动实践
  • 机器人自主探索:基于边界点优化与多步路径规划的SLAM实践
  • 2026实测10款AI智能降重工具红黑榜!优缺点全透明,达标率直接对标行业天花板
  • 2023年CNCF五大新锐项目深度解析:Kwasm、KubeArmor、OpenCost、Headlamp与Dragonfly
  • Chromium内核全面拥抱HEVC:从Chrome硬解支持看浏览器视频生态变革
  • 保姆级教程:手把手教你将YOLOv8n模型导出为TensorRT/RKNN/Horizon可用的ONNX格式(附避坑点)
  • 用AT89C51和DS18B20复刻一个智能电饭煲:从原理图到Proteus仿真的保姆级教程
  • 如何用Obsidian Zettelkasten模板终结知识碎片化:完整指南
  • 使用 curl 命令直接测试 Taotoken 聊天补全接口的快速方法
  • 深入浅出DPCM与DAPM:图解高通音频架构如何实现动态功耗管理与低延迟播放
  • Office 365 官方部署工具保姆级教程:只装Word/Excel/PPT,彻底告别OneDrive和Outlook
  • 嵌入式开发回调注册机制:从函数指针到STM32实战应用
  • 告别盲调!用CCS调试器实时观察TMS320F28377D的SPI寄存器状态
  • 告别单线程!在STM32F4上基于FreeRTOS和LWIP搭建多客户端TCP服务器的完整流程
  • Simulink模型服务接口测试:从策略到实践的完整指南
  • 别再手动算CRC了!用UartAssist的校验计算器5分钟搞定Modbus调试
  • Figma界面汉化终极指南:3分钟实现全中文设计环境
  • VSCode里npm命令报错?别慌,这3种常见原因和解决方法(附环境变量配置)
  • 从“玄学”到科学:实测对比Buck电路环路补偿前后,动态响应到底差多少?(附示波器实测图)
  • 如何快速上手TransNet V2:智能视频镜头检测的完整指南
  • GD32做示波器,模拟前端电路怎么设计?聊聊信号调理与衰减的那些‘坑’
  • 从零连接电脑串口到成功通信:艾德克斯IT6831A电源SCPI控制避坑全记录
  • 高校实验室内部流出:Perplexity物理查询黄金参数配置(含3个未公开API调用指令)
  • 给嵌入式新手的MIPI-DSI协议扫盲:从手机屏幕到Linux驱动的那些事儿