性能优化不是等到系统崩溃才做的事,而是后端开发的基本功。同样的业务,有人写的接口50ms,有人写的500ms,差距就在这些技巧里。下面10个必会优化点,每一个都能直接落地。
1. 数据库索引:最廉价的性能提升
没有索引的查询就像翻遍整本书找一句话。给WHERE、ORDER BY、JOIN字段加索引,复合索引遵循最左前缀。但索引不是越多越好,写多读少的表要控制数量。用EXPLAIN查看执行计划,避免type=ALL全表扫描。
2. 缓存:把压力挡在数据库之前
热点数据放Redis,读多写少的场景效果立竿见影。注意缓存穿透(布隆过滤器/空值缓存)、击穿(互斥锁/逻辑过期)、雪崩(随机过期时间)。本地缓存(Caffeine)适合极热数据,但要注意一致性。
3. 异步处理:别让用户等非核心逻辑
发短信、写日志、生成报表这类耗时操作,用@Async或消息队列异步执行。接口只做核心业务,响应时间从秒级降到毫秒级。但要注意异步任务的失败重试和幂等。
4. 批量操作:减少数据库往返
循环里单条INSERT或UPDATE是性能杀手。用batchInsert、foreach拼接批量SQL,或MyBatis的ExecutorType.BATCH。一次批量提交1000条,比1000次单条提交快一个数量级。
5. 连接池与线程池:复用才是王道
数据库连接池(HikariCP)和HTTP连接池避免频繁创建销毁。线程池核心数按任务类型设置:CPU密集≈核数+1,IO密集≈核数×2以上。队列必须有界,拒绝策略要选对。
6. 分页与懒加载:别一次性查全表
LIMIT分页配合索引,深分页用游标或WHERE id > ?。关联查询用懒加载或分批加载,避免N+1问题。ORM的fetchType默认EAGER要改成LAZY。
7. 减少网络往返与压缩传输
合并接口、合并请求,减少HTTP次数。开启GZIP压缩,大JSON用Protobuf。CDN加速静态资源。微服务间用长连接,避免短连接握手开销。
8. 代码层面:细节决定成败
避免循环内查库、拼接字符串用StringBuilder、集合预设容量、用基本类型代替包装类、减少锁粒度。一个N+1查询就能拖垮整个接口。
9. JVM调优:让GC不再停顿
合理设置堆大小、新生代比例。低延迟选G1或ZGC,吞吐优先选Parallel。监控GC日志,频繁Full GC要排查内存泄漏。别盲目调参,先用jstat和arthas定位问题。
10. 监控与压测:没有度量就没有优化
用Prometheus+Grafana监控QPS、RT、错误率、线程池状态。上线前用JMeter或wrk压测,找到瓶颈再优化。别凭感觉猜,数据会告诉你答案。
总结
性能优化不是玄学,而是“定位瓶颈→针对性优化→验证效果”的闭环。索引、缓存、异步、批量、池化、分页、压缩、代码、JVM、监控,这10个技巧覆盖了后端主要优化面。记住:先测量,再优化;先加缓存,再优化SQL;先异步,再考虑架构。把这10点融入日常开发,你的系统就能扛住更高的并发。