Java 接口高并发优化方案

我按从简单到深入、从前端到数据库的顺序讲。

一、接口入口层优化(最优先)

  1. 接口限流

    • 使用 SentinelGuava RateLimiter 做单机限流
    • 按 IP/用户/接口维度限制 QPS
    • 防止流量打崩服务
  2. 读写分离

    • 查询走从库,写入走主库
    • 用 Sharding-JDBC 或 MyBatis 拦截器自动路由
  3. 异步化

    • 非核心逻辑全部丢线程池或 MQ
    • 例如:日志、通知、统计、埋点、发短信、发邮件
    • 主线程只做核心逻辑,立刻返回

二、缓存优化(高并发核心)

  1. 加本地缓存 Caffeine

    • 热点配置、字典、少量不变数据
    • 比 Redis 少一次网络 IO,性能提升巨大
  2. 加分布式缓存 Redis

    • 商品、用户信息、订单快照、首页数据
    • 设置合理过期时间,避免不一致
  3. 解决缓存三大问题

    • 穿透:缓存空值 + 布隆过滤器
    • 击穿:互斥锁、热点数据永不过期
    • 雪崩:过期时间随机、Redis 集群、多级缓存
  4. 缓存预热

    • 启动时加载热点数据
    • 避免流量来了才大量回源查 DB

三、业务逻辑层优化

  1. 减少远程调用

    • 批量查询、合并 Feign 调用
    • 减少循环内调 RPC,非常影响性能
  2. 减少锁粒度

    • 不用 synchronized 大锁
    • 使用 Redisson 锁、分段锁、乐观锁
    • 能无锁就无锁(CAS、版本号)
  3. 对象复用、减少 GC

    • 避免频繁 new 对象
    • 减少大对象、减少内存拷贝
    • 使用池化:线程池、连接池、HttpClient 池

四、数据库优化(高并发瓶颈大多在这)

  1. 加索引、避免索引失效

    • 最左前缀、不使用函数、不类型隐式转换
    • explain 分析
  2. 避免大事务

    • 拆小事务
    • 禁止事务里包含远程调用、Redis、IO 操作
  3. 分库分表

    • 订单表、日志表按用户 ID / 时间分表
    • Sharding-JDBC 轻松实现
  4. 批量操作代替循环单条

    • 批量 insert、批量 update
    • 减少网络 IO 和事务提交次数
  5. MySQL 配置优化

    • 调整连接池、innodb_buffer_pool
    • 关闭不必要的 binlog、sync_binlog

五、MQ 削峰填谷(秒杀、订单必用)

  1. 请求先入 MQ,后台慢慢消费
  2. 防止数据库被高并发写打挂
  3. 用 RabbitMQ/RocketMQ 异步削峰

典型场景:

下单 → 扣库存 → 支付 → 物流

高并发下只做核心下单,其余全部异步


六、架构层面(高级优化)

  1. 集群部署 + 负载均衡

    • Nginx 分发
    • 服务无状态,水平扩容
  2. 动静分离

    • 静态资源放 CDN
    • 接口 API 走后端
  3. 服务降级、兜底

    • 核心接口保活
    • 非核心接口直接返回默认值
  4. 分布式锁

    • 秒杀、库存扣减必须加
    • Redisson 看门狗自动续期

七、你在面试可以直接背的总结(非常加分)

高并发接口优化我一般从这几层入手:

  1. 入口限流、异步化、读写分离
  2. 多级缓存(Caffeine+Redis)解决热点数据
  3. 业务层减少 RPC、缩小锁范围、避免大事务
  4. DB 加索引、批量操作、分库分表
  5. 使用 MQ 削峰
  6. 最后通过集群、降级、负载均衡 保证整体可用性
    这样一套下来,接口性能能提升 10~100 倍

相关推荐
rannn_1115 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
爱喝水的鱼丶6 小时前
SAP-ABAP:接口与报表场景专项优化:RFC/ODATA 接口、ALV 报表的性能提升方案
运维·性能优化·接口·sap·abap·rfc·经验交流
IKUN家族7 小时前
Spring IoC&DI
java·spring·rpc
山荷枝8 小时前
03-框架--Spring
java·后端·spring
ChaHae-In9 小时前
SpringBoot统一功能处理
java·spring boot·后端
coder!mq9 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding9 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
心平气和量大福大10 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
9523610 小时前
Spring-cloud配置中心
java·spring·spring cloud·微服务
ydd10010010 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言