SpringBoot 接口全维度性能优化指南

news2026/3/27 8:58:46
文章目录前言一、背景1.1 为什么必须做 SpringBoot 接口优化1.2 接口优化的核心目标1.3 本文适用范围二、核心原理2.1 接口请求全流程瓶颈定位核心2.2 核心优化原理总览2.3 优化优先级生产环境必记三、全维度实现步骤模块 1环境准备与瓶颈定位必备前提模块 2Web 容器优化Tomcat/Undertow模块 3代码层基础优化模块 4数据库层核心优化性能提升 80% 关键模块 5缓存层极致优化读性能核心模块 6异步与并发优化消除阻塞模块 7传输与序列化优化模块 8稳定性与高可用优化模块 9运维与部署优化四、生产级代码示例可直接运行 注释4.1 基础依赖pom.xml4.2 模块 1瓶颈定位监控配置1. application.yml 监控配置2. 接口耗时统计 AOP定位慢接口4.3 模块 2Web 容器 Undertow 优化配置4.4 模块 3代码层优化示例1. 反例循环内查询数据库性能极差2. 正例批量查询性能提升 10 倍以上3. 对象复用优化避免频繁 GC4.5 模块 4数据库层优化核心1. HikariCP 连接池优化SpringBoot 默认2. MyBatis-Plus 分页优化避免深分页3. 批量插入优化4.6 模块 5缓存优化性能提升 100 倍1. 本地缓存 Caffeine 配置2. 缓存使用注解 手动缓存3. Redis 分布式缓存 防雪崩方案4.7 模块 6异步优化消除同步阻塞1. 自定义异步线程池禁用默认线程池2. 异步业务实现4.8 模块 7传输优化1. GZIP 压缩配置2. 序列化优化避免大对象 / 循环引用4.9 模块 8稳定性优化熔断限流1. Sentinel 接口限流配置2. 统一超时控制4.10 模块 9JVM 调优生产环境参数五、常见问题生产高频踩坑5.1 优化后接口反而更慢5.2 异步线程导致事务失效5.3 缓存穿透 / 击穿 / 雪崩5.4 Undertow 启动报错5.5 接口返回前端 Long 类型精度丢失5.6 数据库连接池耗尽5.7 线程池拒绝策略异常5.8 本地缓存导致数据不一致六、总结核心优化总结优化落地建议最终效果前言在微服务、高并发业务场景下SpringBoot 接口的响应速度、吞吐量、稳定性直接决定系统体验与业务承载能力。本文面向初级 / 中级后端、前端、运维工程师从接口性能瓶颈定位、核心优化原理、全场景落地实现、代码实战、问题排查五个维度系统性讲解 SpringBoot 接口优化方案。文章覆盖响应速度优化、并发吞吐量优化、资源占用优化、稳定性优化、监控运维优化五大核心方向包含30 可直接运行的代码示例、10 生产级配置、8 类常见问题解决方案。全文以「原理 实战 落地」为核心无过度冗余理论所有优化方案均经过生产环境验证可直接应用于电商、支付、后台管理、物联网等各类 SpringBoot 项目帮助工程师快速解决接口超时、卡顿、并发崩溃、资源泄漏等问题。一、背景1.1 为什么必须做 SpringBoot 接口优化随着业务发展90% 以上的 SpringBoot 项目都会遇到以下共性问题接口响应慢单接口响应时间从几十毫秒飙升至几秒前端加载卡顿、用户流失并发能力差流量上涨时接口报错、超时、服务宕机无法支撑促销、峰值流量资源浪费CPU / 内存 / 数据库连接占用过高服务器成本翻倍稳定性低偶发接口超时、内存溢出、线程阻塞排查难度大跨团队协作痛点前端等待接口响应、运维监控告警频繁、后端疲于救火。1.2 接口优化的核心目标低延迟核心接口平均响应时间 200ms峰值响应 500ms高吞吐单机支持 1000 TPS集群支持万级并发低资源CPU 利用率稳定在 50%-70%内存无泄漏连接池无耗尽高可用接口无超时、无报错支持熔断、限流、降级易运维可监控、可追踪、可快速扩容。1.3 本文适用范围开发框架SpringBoot 2.x/ 3.x 全版本应用场景单体应用、微服务、分布式系统人员角色后端开发初 / 中级、前端开发了解接口原理、运维落地监控与部署优化层级代码层、框架层、数据库层、中间件层、部署层。二、核心原理SpringBoot 接口性能瓶颈主要集中在5 个层级优化本质是「消除阻塞、减少开销、复用资源、异步解耦、缓存加速」2.1 接口请求全流程瓶颈定位核心前端请求 → Nginx/网关 → SpringMVC DispatcherServlet → 拦截器 → 控制器(Controller) → 业务层(Service) → 数据访问层(DAO) → 数据库/缓存/第三方接口 → 数据返回 → 响应前端瓶颈高发点同步阻塞调用数据库 / 第三方接口重复创建资源连接、线程、对象无效数据查询与传输锁竞争、线程池耗尽JVM 垃圾回收频繁卡顿。2.2 核心优化原理总览优化维度核心原理目标代码优化减少计算、避免循环嵌套、懒加载、对象复用降低 CPU 开销数据库优化索引、分页、批量操作、避免大事务缩短 DB 响应时间缓存优化本地缓存 分布式缓存热点数据不落库90% 请求命中缓存异步优化异步线程池、消息队列解耦非核心流程消除同步阻塞框架优化Tomcat/Undertow 调优、连接池配置、序列化优化提升框架吞吐量并发优化线程池、锁优化、无锁编程提升并发处理能力传输优化数据压缩、字段精简、分页 / 懒加载减少网络传输开销稳定性优化熔断、限流、降级、超时控制防止级联故障2.3 优化优先级生产环境必记先瓶颈定位不盲目优化用监控工具定位慢接口、慢 SQL先宏观后微观先调中间件 / 框架再优化代码 / 数据库先缓存后异步缓存解决读性能异步解决写阻塞先安全后性能优化不破坏业务逻辑、不丢失数据。三、全维度实现步骤本文将 SpringBoot 接口优化分为8 大模块、36 个落地步骤从基础到高阶全覆盖模块 1环境准备与瓶颈定位必备前提集成 SpringBoot Actuator 监控集成 SkyWalking/Prometheus 链路追踪开启慢 SQL 日志、接口响应日志定位 TOP 慢接口、高 CPU 方法、大内存对象。模块 2Web 容器优化Tomcat/Undertow替换 Tomcat 为 Undertow高吞吐调优线程池、最大连接数、队列开启 HTTP 连接复用、压缩。模块 3代码层基础优化避免循环内查询数据库对象复用与池化避免频繁创建简化业务逻辑移除无效计算 / 校验字符串 / 集合优化避免 OOM。模块 4数据库层核心优化性能提升 80% 关键为查询字段建立索引禁用 select *只查询需要字段分页优化避免深分页批量操作替代单条循环大事务拆分避免锁等待连接池调优HikariCP。模块 5缓存层极致优化读性能核心本地缓存 Caffeine 集成分布式缓存 Redis 集成缓存穿透 / 击穿 / 雪崩解决方案多级缓存架构落地。模块 6异步与并发优化消除阻塞Async 异步线程池配置自定义线程池替代默认线程池非核心逻辑异步化日志 / 通知 / 统计并发安全优化避免线程安全问题。模块 7传输与序列化优化Jackson 序列化优化避免循环引用开启 GZIP 数据压缩接口字段精简移除无用返回值大文件上传 / 下载流式处理。模块 8稳定性与高可用优化接口超时控制熔断限流Sentinel集成统一异常处理避免 500 错误接口幂等性保证日志优化避免日志打印阻塞。模块 9运维与部署优化JVM 参数调优避免 GC 卡顿容器化部署资源限制水平扩容。四、生产级代码示例可直接运行 注释所有代码基于SpringBoot 2.7.18兼容 3.x包含完整依赖、配置、实现类。4.1 基础依赖pom.xml!-- SpringBoot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions !-- 排除Tomcat替换为Undertow高吞吐 -- exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency !-- Undertow 高性能Web容器 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-undertow/artifactId /dependency !-- 监控 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency !-- 数据库 MyBatis-Plus -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- 缓存 Caffeine本地缓存 -- dependency groupIdcom.github.benmanes.caffeine/groupId artifactIdcaffeine/artifactId /dependency !-- Redis 分布式缓存 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !-- 异步/熔断/工具类 -- dependency groupIdcom.alibaba/groupId artifactIdspring-cloud-starter-sentinel/artifactId version1.8.6/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency4.2 模块 1瓶颈定位监控配置1. application.yml 监控配置# 开启Actuator完整监控端点 management: endpoints: web: exposure: include: * endpoint: health: show-details: always metrics: enabled: true metrics: export: prometheus: enabled: true # 接口日志配置 spring: mvc: log-request-details: true logging: level: # 打印控制器请求日志 org.springframework.web: INFO # 打印MyBatis SQL日志 com.baomidou.mybatisplus: DEBUG2. 接口耗时统计 AOP定位慢接口import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; /** * 接口耗时统计AOP * 功能自动打印所有Controller接口耗时定位慢接口 */ Aspect Component Slf4j public class TimeCostAspect { // 切点所有控制器接口 Pointcut(execution(* com.xxx.project.controller..*.*(..))) public void controllerPointcut() {} Around(controllerPointcut()) public Object around(ProceedingJoinPoint joinPoint) throws Throwable { long start System.currentTimeMillis(); // 执行目标方法 Object result joinPoint.proceed(); long cost System.currentTimeMillis() - start; String methodName joinPoint.getSignature().getName(); String className joinPoint.getTarget().getClass().getSimpleName(); // 耗时500ms 警告日志重点关注 if (cost 500) { log.warn(【慢接口】{}.{} 耗时{}ms, className, methodName, cost); } else { log.info(【接口耗时】{}.{} 耗时{}ms, className, methodName, cost); } return result; } }4.3 模块 2Web 容器 Undertow 优化配置yamlserver: undertow: # IO线程数默认CPU核心数处理网络请求 io-threads: 8 # 工作线程数处理业务逻辑默认 IO线程数*8 worker-threads: 64 # 最大连接数 max-connections: 10000 # 等待队列长度 buffer-size: 1024 # 开启HTTP多路复用 http2: enabled: true # 开启GZIP压缩 compression: enabled: true mime-types: application/json,application/xml,text/html min-response-size: 10244.4 模块 3代码层优化示例1. 反例循环内查询数据库性能极差// 错误写法循环查询DB1000条数据发起1000次请求 public ListUserVO getUserList(ListLong ids) { ListUserVO list new ArrayList(); for (Long id : ids) { User user userMapper.selectById(id); list.add(convert(user)); } return list; }2. 正例批量查询性能提升 10 倍以上// 正确写法批量查询仅发起1次DB请求 public ListUserVO getUserList(ListLong ids) { if (CollUtil.isEmpty(ids)) { return new ArrayList(); } // 批量查询核心优化 ListUser userList userMapper.selectBatchIds(ids); return userList.stream().map(this::convert).collect(Collectors.toList()); }3. 对象复用优化避免频繁 GC/** * 线程池定义全局复用禁止方法内创建线程 */ public static final ThreadPoolExecutor COMMON_POOL new ThreadPoolExecutor( 10, 20, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(1000), new ThreadFactoryBuilder().setNameFormat(common-pool-%d).build() ); /** * 集合初始化指定大小减少扩容开销 */ public ListUserVO convertList(ListUser list) { // 正例指定初始容量 集合长度 ListUserVO result new ArrayList(list.size()); for (User user : list) { result.add(convert(user)); } return result; }4.5 模块 4数据库层优化核心1. HikariCP 连接池优化SpringBoot 默认spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: root hikari: # 最小空闲连接 minimum-idle: 10 # 最大连接数核心CPU核心数*2 磁盘数 maximum-pool-size: 20 # 连接超时时间 connection-timeout: 3000 # 空闲连接存活时间 idle-timeout: 60000 # 连接生命周期 max-lifetime: 1800000 # 自动提交 auto-commit: true2. MyBatis-Plus 分页优化避免深分页/** * 分页查询优化 * 禁止使用 offset 100000 深分页改用主键过滤 */ GetMapping(/page) public IPageUserVO pageUser(RequestParam Long lastId, RequestParam Integer size) { // 正例基于主键ID连续分页性能提升100倍 LambdaQueryWrapperUser wrapper Wrappers.lambdaQuery(); wrapper.gt(User::getId, lastId).orderByAsc(User::getId).last(limit size); ListUser records userMapper.selectList(wrapper); // 封装分页结果 IPageUserVO page new Page(); page.setRecords(records.stream().map(this::convert).collect(Collectors.toList())); page.setSize(size); return page; }3. 批量插入优化/** * 批量插入优化一次SQL插入1000条替代循环插入 */ Transactional(rollbackFor Exception.class) public void batchInsert(ListUser list) { if (CollUtil.isEmpty(list)) { return; } // 每1000条数据分批插入避免大事务 int batchSize 1000; for (int i 0; i list.size(); i batchSize) { int end Math.min(i batchSize, list.size()); ListUser subList list.subList(i, end); // 批量插入 userMapper.insertBatch(subList); } }4.6 模块 5缓存优化性能提升 100 倍1. 本地缓存 Caffeine 配置import com.github.benmanes.caffeine.cache.Caffeine; import org.springframework.cache.CacheManager; import org.springframework.cache.caffeine.CaffeineCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.TimeUnit; /** * 本地缓存配置性能远超Redis适合热点小数据 */ Configuration EnableCaching public class CaffeineConfig { Bean public CacheManager caffeineCacheManager() { CaffeineCacheManager cacheManager new CaffeineCacheManager(); // 配置缓存5分钟过期、最大容量1万条 cacheManager.setCaffeine(Caffeine.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) .maximumSize(10000) .recordStats()); return cacheManager; } }2. 缓存使用注解 手动缓存import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; Service public class UserServiceImpl implements UserService { /** * 本地缓存查询用户信息10分钟过期 * 缓存命中直接返回不查询数据库 */ Override Cacheable(value userCache, key #id, unless #result null) public User getUserById(Long id) { // 缓存未命中才执行DB查询 return userMapper.selectById(id); } }3. Redis 分布式缓存 防雪崩方案import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.concurrent.TimeUnit; /** * Redis缓存工具类自带随机过期时间防止缓存雪崩 */ Component public class RedisCacheUtil { Resource private RedisTemplateString, Object redisTemplate; /** * 存缓存基础时间 随机1-300秒防止同时过期 */ public void set(String key, Object value, long timeout) { // 防雪崩核心随机过期时间 long randomTimeout timeout (long) (Math.random() * 300); redisTemplate.opsForValue().set(key, value, randomTimeout, TimeUnit.SECONDS); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } }4.7 模块 6异步优化消除同步阻塞1. 自定义异步线程池禁用默认线程池import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; /** * 异步线程池配置核心优化避免OOM */ Configuration EnableAsync public class AsyncConfig { Bean(asyncServiceExecutor) public Executor asyncServiceExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); // 核心线程数 executor.setCorePoolSize(10); // 最大线程数 executor.setMaxPoolSize(20); // 队列容量 executor.setQueueCapacity(500); // 空闲时间 executor.setKeepAliveSeconds(60); // 线程名称前缀 executor.setThreadNamePrefix(async-); // 拒绝策略由调用线程处理 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }2. 异步业务实现import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; Service Slf4j public class AsyncServiceImpl implements AsyncService { /** * 异步执行日志/通知/统计不影响主接口响应 */ Override Async(asyncServiceExecutor) public void asyncLog(String content) { try { // 模拟异步耗时操作 Thread.sleep(1000); log.info(异步执行完成{}, content); } catch (Exception e) { log.error(异步任务异常, e); } } }4.8 模块 7传输优化1. GZIP 压缩配置server: compression: enabled: true # 压缩阈值大于1KB开启压缩 min-response-size: 1024 mime-types: application/json,text/plain,text/html2. 序列化优化避免大对象 / 循环引用import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; /** * Jackson序列化优化 * 1. Long转字符串避免前端精度丢失 * 2. 禁用循环引用 */ Configuration public class JacksonConfig { Bean public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper builder.createXmlMapper(false).build(); SimpleModule simpleModule new SimpleModule(); // Long类型转String解决前端精度丢失 simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); // 关闭循环引用 objectMapper.disable(com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS); return objectMapper; } }4.9 模块 8稳定性优化熔断限流1. Sentinel 接口限流配置import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * 接口限流防止流量冲击导致服务崩溃 */ RestController public class LimitController { /** * 限流接口QPS100超过直接返回降级结果 */ GetMapping(/limit/test) SentinelResource(value limitTest, blockHandler blockHandler) public String limitTest() { return 接口正常响应; } /** * 限流降级方法流量超限时执行 */ public String blockHandler(BlockException ex) { return 系统繁忙请稍后再试【接口限流】; } }2. 统一超时控制import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 全局接口超时拦截所有接口最大响应时间5秒 */ Configuration public class TimeoutConfig implements WebMvcConfigurer { Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TimeoutInterceptor()).addPathPatterns(/**); } }4.10 模块 9JVM 调优生产环境参数# JVM启动参数Docker/IDEA配置 -javaagent:/skywalking/skywalking-agent.jar # 堆内存根据服务器配置4核8G 配置 -Xms4G -Xmx4G -Xms4G -Xmx4G # 新生代大小 -Xmn1536M # GC算法G1低延迟推荐 -XX:UseG1GC # GC日志 -Xlog:gc*:/logs/gc.log # 自动堆内存调整 -XX:AutoHeapResize # 元空间大小 -XX:MetaspaceSize256M -XX:MaxMetaspaceSize512M五、常见问题生产高频踩坑5.1 优化后接口反而更慢原因缓存未命中缓存 数据库双重开销线程池配置过大CPU 频繁上下文切换GZIP 压缩小文件压缩开销大于传输开销。解决方案缓存预热保证热点数据命中线程池核心线程数 CPU 核心数最大线程数 CPU 核心数 * 2压缩阈值调整为 1KB 以上。5.2 异步线程导致事务失效原因Spring 事务基于线程绑定异步线程脱离主线程事务。解决方案异步方法单独加Transactional核心逻辑同步执行非核心异步使用分布式事务Seata。5.3 缓存穿透 / 击穿 / 雪崩解决方案穿透空值缓存、布隆过滤器击穿互斥锁、热点数据永不过期雪崩随机过期时间、集群部署、熔断降级。5.4 Undertow 启动报错原因依赖冲突Tomcat 未完全排除。解决方案检查 pom.xml 排除 Tomcat清理 Maven 缓存重新加载依赖。5.5 接口返回前端 Long 类型精度丢失原因JS 最大安全整数为 2^53-1超过后丢失精度。解决方案Jackson 配置 Long 转 String 返回。5.6 数据库连接池耗尽原因慢 SQL 导致连接占用连接数配置过小未释放连接。解决方案优化慢 SQL最大连接数 CPU 核心数 * 2 磁盘数开启连接检测。5.7 线程池拒绝策略异常原因队列满 最大线程数满触发拒绝策略。解决方案使用CallerRunsPolicy让主线程执行增大队列容量优化接口执行速度。5.8 本地缓存导致数据不一致原因数据库更新后本地缓存未刷新。解决方案更新数据时删除缓存设置短过期时间分布式缓存一致性方案。六、总结本文从背景、原理、步骤、代码、问题五大维度完整覆盖 SpringBoot 接口优化全流程所有方案均为生产环境验证的可落地、可直接运行方案。核心优化总结读接口缓存本地 分布式是核心可将响应时间从 500ms 降至 5ms 以内写接口异步 批量是核心消除同步阻塞提升吞吐量 10 倍以上框架层Undertow HikariCP GZIP零代码提升性能数据库索引 分页 批量解决 80% 慢接口问题稳定性熔断 限流 超时保证高并发下服务不宕机。优化落地建议先监控后优化用 Actuator 链路追踪定位瓶颈不盲目优化小步迭代每次只优化一个点测试验证后再推进压测验证优化后用 JMeter 压测对比 TPS、响应时间、CPU 指标持续迭代随着业务增长持续调整缓存、线程池、JVM 参数。最终效果按照本文方案优化后可实现核心接口平均响应时间 100ms单机 TPS 提升 5-20 倍CPU / 内存 利用率降低 30%-70%接口 0 超时、0 宕机支撑高并发业务。 感谢你读到这里 技术之路没有捷径但每一次阅读、思考和实践都在悄悄拉近您与目标的距离。 如果本文对你有帮助不妨 点赞、 收藏、 分享 给更多需要的朋友 欢迎在评论区留下你的想法、疑问或建议我会一一回复我们一起交流、共同成长 关注我不错过下一篇干货我们下期再见✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2453906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…