RuoYi框架二次开发系列(五)性能优化、Redis缓存实战、分布式部署、接口限流与安全加固生产方案

在前四篇系列文章中,我们完成了RuoYi规范开发、数据权限、第三方集成、定时任务与工作流开发,已经可以搭建出功能完整、业务闭环的企业级后台系统。但能跑的系统 ≠ 生产可用系统。

在高并发、大数据量、集群部署的生产环境中,原生RuoYi存在诸多问题:接口响应慢、数据库压力大、重复查询、集群任务重复执行、接口被刷、权限越权、日志泄露等。

本篇为系列第五篇,聚焦生产环境核心优化与安全加固,从缓存实战、SQL优化、性能调优、分布式部署、接口限流、安全防护六个维度,提供全套可落地、可上线的生产级方案,解决系统卡顿、并发瓶颈、集群冲突、安全漏洞等核心问题。

一、RuoYi生产环境常见性能问题盘点

未优化的原生RuoYi,在业务量上涨后会集中暴露以下问题,也是企业项目最核心的性能痛点:

  • 高频查询接口频繁访问数据库,无缓存,QPS升高后数据库CPU爆满
  • 列表查询未做分页、未加索引,大数据量查询超时、接口卡死
  • 重复代码查询、重复参数读取,接口响应时间居高不下
  • 单机部署存在单点故障,服务宕机导致系统全线瘫痪
  • 集群部署定时任务重复执行,产生重复数据、重复对账问题
  • 对外开放接口无限流,容易被恶意请求刷崩服务
  • 原生安全策略薄弱,存在XSS、SQL注入、越权访问等潜在漏洞
    本篇针对性解决以上所有问题,全方位完成系统生产级升级。

二、Redis缓存高阶实战(解决数据库查询瓶颈)

RuoYi原生集成Redis,但多数开发者仅使用基础缓存功能,未发挥缓存最大价值。合理的缓存设计可将接口响应速度从数百毫秒压缩至10ms以内,大幅降低数据库压力。

2.1 框架原生缓存工具类使用规范

RuoYi内置 RedisCache 工具类,封装了所有常用缓存操作,禁止手动注入 RedisTemplate 重复开发,统一使用原生工具,保证项目标准化。

核心常用方法实战:

bash 复制代码
// 存入缓存(默认永久)
redisCache.setCacheObject("key", value);
// 存入缓存(指定过期时间,5分钟)
redisCache.setCacheObject("key", value, 5, TimeUnit.MINUTES);
// 获取缓存
redisCache.getCacheObject("key");
// 删除缓存
redisCache.deleteObject("key");
// 批量删除缓存
redisCache.deleteObjects(keys);
// 判断缓存是否存在
redisCache.hasKey("key");

2.2 企业级缓存落地场景(高频必用)

  • 数据字典缓存:系统字典变动频率极低,全局缓存,避免每次翻译状态都查库
  • 系统参数缓存:全局配置参数、业务开关,缓存后无需频繁读取数据库
  • 高频业务数据缓存:分类数据、区域数据、固定配置数据
  • 验证码、限流计数缓存:短信、图形验证码、接口限流计数器
  • 登录用户信息缓存:框架原生已实现,缓存登录用户权限、角色信息

2.3 缓存三大核心问题解决方案(生产必避坑)

2.3.1 缓存穿透

问题:查询不存在的数据,直接穿透到数据库,数据库压力剧增。

解决方案:空值缓存 + 布隆过滤器,查询为空时缓存空对象,设置短期过期时间,避免频繁查库。

2.3.2 缓存击穿

问题:热点Key过期瞬间,大量请求同时访问数据库。

解决方案:互斥锁 + 热点Key永不过期,核心热点数据取消过期时间,后台定时更新。

2.3.3 缓存雪崩

问题:大量缓存同时过期,瞬间请求全部打向数据库。

解决方案:过期时间随机偏移,在原有过期时间基础上增加随机秒数,避免批量Key同时失效。

2.4 缓存更新生产规范

统一遵循:先更新数据库,再删除缓存,禁止先改缓存再改数据库,避免数据不一致;业务数据新增、修改、删除后,必须主动清空对应缓存,保证数据实时同步。

三、SQL优化与接口性能调优

绝大多数RuoYi系统卡顿,根源并非代码问题,而是SQL低效、索引缺失、数据加载不合理。本节讲解零成本、高收益的性能调优方案。

3.1 基础强制优化规范

  • 所有列表接口强制分页:禁止无条件查询全表数据,哪怕业务数据量小,必须保留分页逻辑,适配后期数据增长
  • 关键字段必建索引:查询条件、排序字段、关联字段(dept_id、create_by、status、order_id)全部建立索引
  • 禁止select *:按需查询字段,减少数据传输与内存占用
  • 避免大事务:长事务导致数据库锁等待、超时、死锁,拆分复杂事务为独立小事务

3.2 大数据量批量处理优化

批量导入、批量统计、数据迁移等场景,禁止单次加载全量数据,采用分批查询、分批处理,每次处理1000条,避免OOM内存溢出。

3.3 日志与冗余代码优化

生产环境关闭DEBUG日志,减少IO输出;删除无用打印、重复查询、冗余判断,精简接口执行链路,压缩响应耗时。

四、RuoYi分布式集群部署方案(解决单点故障)

单机部署存在严重单点故障,生产环境必须集群多节点部署。RuoYi天然支持分布式,只需简单配置即可实现无缝集群。

4.1 集群部署核心改造点

  • 统一Redis缓存:多节点共享登录态、权限、缓存数据,实现登录无感切换
  • 统一数据库:所有节点连接同一业务数据库,保证数据一致性
  • 开启Quartz集群锁:解决定时任务多节点重复执行问题
  • 静态资源统一存储:替换本地存储为OSS存储,多节点资源访问统一
  • Nginx负载均衡:统一入口,分发请求至不同服务节点,实现高可用

4.2 定时任务集群冲突终极解决

集群部署最大坑点:多节点同时触发定时任务,导致重复执行、数据错乱。

解决方案:开启Quartz数据库集群模式,配置如下:

bash 复制代码
spring:
  quartz:
    job-store-type: jdbc
    jdbc:
      initialize-schema: embedded
    properties:
      org.quartz.jobStore.isClustered: true
      org.quartz.jobStore.clusterCheckinInterval: 1000

开启后,框架通过数据库锁抢占任务,同一时间仅一个节点执行任务,彻底解决集群重复调度问题。

4.3 集群登录会话共享

RuoYi默认基于Redis实现Token与会话共享,集群部署无需改造登录逻辑,所有节点登录态互通,支持负载均衡无感切换。

五、接口限流与防刷实战(保护服务稳定性)

对外开放的登录、注册、短信、查询接口,极易被恶意刷请求、高频访问,导致服务瘫痪。本节实现自定义注解+Redis接口限流方案,精准控制接口访问频次。

5.1 自定义限流注解

bash 复制代码
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {
    // 限流时间(秒)
    int time() default 60;
    // 最大请求次数
    int count() default 10;
    // 限流提示语
    String msg() default "请求过于频繁,请稍后再试";
}

5.2 AOP限流拦截核心逻辑

通过AOP切面拦截注解接口,基于IP+接口路径生成唯一Key,统计单位时间内请求次数,超出阈值直接拦截,返回限流提示。

5.3 业务场景适配

  • 短信接口:60秒仅允许1次请求,杜绝恶意刷短信
  • 登录接口:1分钟5次请求,防止暴力破解密码
  • 公开查询接口:限制高频请求,保护服务

六、系统全方位安全加固(生产必备)

原生RuoYi安全机制仅满足基础使用,生产环境需全方位加固,杜绝XSS攻击、SQL注入、越权访问、信息泄露等安全隐患。

6.1 账号安全加固

  • 开启密码重试锁定:多次密码错误锁定账号,防止暴力破解
  • 开启单点登录:同一账号仅允许一端在线,挤退旧会话
  • 密码加密存储,禁止明文、弱密码,强制密码复杂度规则
  • 闲置Token自动过期,缩短Token有效期,提升安全性

6.2 接口安全加固

  • 统一参数校验,过滤特殊字符,防止XSS脚本注入
  • MyBatis参数预编译,杜绝SQL注入漏洞
  • 所有接口统一权限校验、数据权限校验,杜绝横向越权、纵向越权
  • 关闭生产环境错误堆栈信息展示,避免代码结构泄露

6.3 文件上传安全加固

  • 限制上传文件类型、大小,禁止上传exe、jar、php、jsp等脚本文件
  • 文件重命名存储,避免恶意文件名执行脚本
  • 上传文件独立域名、OSS存储,与业务服务隔离

6.4 日志安全规范

  • 禁止打印密码、密钥、短信验证码、用户隐私信息
  • 操作日志、登录日志完整留存,便于安全审计与问题排查
  • 定期归档日志,防止日志泄露、磁盘爆满

七、生产环境最佳实践汇总

  1. 缓存优先:高频查询、静态配置全部缓存,减少数据库IO压力
  2. SQL极简:强制分页、建索引、按需查字段,杜绝低效查询
  3. 集群高可用:多节点部署+负载均衡,消除单点故障
  4. 任务防重:开启Quartz集群锁,保障定时任务唯一执行
  5. 接口限流:核心公开接口全部添加限流规则,防止恶意请求
  6. 安全兜底:账号、接口、文件、日志全方位加固,消除安全漏洞

八、系列终章总结

本篇作为RuoYi二次开发系列核心收尾篇,从性能、架构、安全、高可用四个维度,完成了系统从「可用」到「生产稳定可用」的全面升级。

整套系列教程覆盖:开发规范→权限体系→第三方集成→自动化任务→工作流审批→性能优化→分布式部署→安全加固,完整覆盖企业RuoYi项目从0到1落地、从基础CRUD到高并发复杂系统的全流程开发能力,完全适配职场实战、项目交付、企业开发所有场景。

九、后续拓展预告

后续将持续更新系列番外篇:RuoYi-Vue3新版适配、微服务改造(RuoYi-Cloud)、自定义大屏可视化、代码生成器定制、接口文档自动化等进阶内容,持续拓展RuoYi全场景开发能力。

相关推荐
番茄炒鸡蛋加糖2 小时前
Redis--Lua 脚本原子性与滑动窗口限流
数据库·redis·lua
GitLqr4 小时前
Flutter 3.44 性能飞跃:深度解析 Android Platform View 的 HCPP 新特性
android·flutter·性能优化
顺风尿一寸4 小时前
Redis List 阻塞队列底层探秘:LPUSH 如何唤醒沉睡的 BRPOP
redis
雨的旋律20994 小时前
redis
java·数据库·redis
老刘说AI5 小时前
SGLang 深度优化: Radix 缓存与复杂任务的极致吞吐
人工智能·神经网络·机器学习·缓存·架构·sglang
AI分享猿5 小时前
重度长上下文开发怎么选?先看缓存是否吃额度
缓存·ai编程
向日的葵0066 小时前
Redis会话机制vsJWT机制深度解析
数据库·redis·python·缓存·系统架构·jwt
小龙报7 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
清泓y7 小时前
Android内存管理与性能优化面试真题
android·面试·性能优化