我按从简单到深入、从前端到数据库的顺序讲。
一、接口入口层优化(最优先)
-
接口限流
- 使用
Sentinel或Guava RateLimiter做单机限流 - 按 IP/用户/接口维度限制 QPS
- 防止流量打崩服务
- 使用
-
读写分离
- 查询走从库,写入走主库
- 用 Sharding-JDBC 或 MyBatis 拦截器自动路由
-
异步化
- 非核心逻辑全部丢线程池或 MQ
- 例如:日志、通知、统计、埋点、发短信、发邮件
- 主线程只做核心逻辑,立刻返回
二、缓存优化(高并发核心)
-
加本地缓存 Caffeine
- 热点配置、字典、少量不变数据
- 比 Redis 少一次网络 IO,性能提升巨大
-
加分布式缓存 Redis
- 商品、用户信息、订单快照、首页数据
- 设置合理过期时间,避免不一致
-
解决缓存三大问题
- 穿透:缓存空值 + 布隆过滤器
- 击穿:互斥锁、热点数据永不过期
- 雪崩:过期时间随机、Redis 集群、多级缓存
-
缓存预热
- 启动时加载热点数据
- 避免流量来了才大量回源查 DB
三、业务逻辑层优化
-
减少远程调用
- 批量查询、合并 Feign 调用
- 减少循环内调 RPC,非常影响性能
-
减少锁粒度
- 不用
synchronized大锁 - 使用
Redisson锁、分段锁、乐观锁 - 能无锁就无锁(CAS、版本号)
- 不用
-
对象复用、减少 GC
- 避免频繁 new 对象
- 减少大对象、减少内存拷贝
- 使用池化:线程池、连接池、HttpClient 池
四、数据库优化(高并发瓶颈大多在这)
-
加索引、避免索引失效
- 最左前缀、不使用函数、不类型隐式转换
- 用
explain分析
-
避免大事务
- 拆小事务
- 禁止事务里包含远程调用、Redis、IO 操作
-
分库分表
- 订单表、日志表按用户 ID / 时间分表
- Sharding-JDBC 轻松实现
-
批量操作代替循环单条
- 批量 insert、批量 update
- 减少网络 IO 和事务提交次数
-
MySQL 配置优化
- 调整连接池、innodb_buffer_pool
- 关闭不必要的 binlog、sync_binlog
五、MQ 削峰填谷(秒杀、订单必用)
- 请求先入 MQ,后台慢慢消费
- 防止数据库被高并发写打挂
- 用 RabbitMQ/RocketMQ 异步削峰
典型场景:
下单 → 扣库存 → 支付 → 物流
高并发下只做核心下单,其余全部异步。
六、架构层面(高级优化)
-
集群部署 + 负载均衡
- Nginx 分发
- 服务无状态,水平扩容
-
动静分离
- 静态资源放 CDN
- 接口 API 走后端
-
服务降级、兜底
- 核心接口保活
- 非核心接口直接返回默认值
-
分布式锁
- 秒杀、库存扣减必须加
- Redisson 看门狗自动续期
七、你在面试可以直接背的总结(非常加分)
高并发接口优化我一般从这几层入手:
- 入口限流、异步化、读写分离
- 多级缓存(Caffeine+Redis)解决热点数据
- 业务层减少 RPC、缩小锁范围、避免大事务
- DB 加索引、批量操作、分库分表
- 使用 MQ 削峰
- 最后通过集群、降级、负载均衡 保证整体可用性
这样一套下来,接口性能能提升 10~100 倍。