这个服务的响应时间随并发上升得很快。我盯着屏幕,觉得这才是我的一天。我把执行计划贴出来逐行分析,发现少了一个索引。好在最后有惊无险

优化的尽头是玄学:同样的代码,重启之后性能就是不一样。我愣了两秒,然后继续敲代码。我发现这个批任务的瓶颈在单机磁盘 IO。这条经验值直接拉满

加了缓存之后接口是快了,就是每次改数据都要跟缓存斗智斗勇。我默默打开了编辑器,准备一步步验证。我把这个算法的复杂度从平方降到了线性,效果明显

性能测试报告很完美,上线第一天用户量一来,服务器当场表演了一个原形毕露。我先给自己泡了杯茶,做好了打持久战的准备。我把这个对象的复用池加上了,创建开销降了很多。同事说这波操作可以写进新人培训教材

缓存的失效策略比缓存本身更难设计。我叹了口气,然后打开了编辑器。我把这个日志的同步写改成了异步的,耗时不明显了。我把它写进了组内的避坑文档第一章

把 200 毫秒的接口优化到 20 毫秒,第二天产品加了个新功能,又变回 200 毫秒。我抬起头看了看周围,大家都一样。我发现这个接口的返回体有两兆,其中九成没用。世界瞬间清净了

这个接口的耗时有一半花在了它不必要做的事情上。我停了一下,然后继续手上的活。我发现这个批任务的瓶颈在单机磁盘 IO。感动,然后我学到了新的一课

我把这个批处理的批次调大了,整体耗时降了四成。我把相关的记录都翻了出来做对照。我发现这个功能的耗时随数据量线性增长,需要重构。第二天这个方案就变成了团队标准做法

把 200 毫秒的接口优化到 20 毫秒,第二天产品加了个新功能,又变回 200 毫秒。我笑了笑,决定不解释。我把这个算法的复杂度从平方降到了线性,效果明显。这大概就是程序员的人生吧

缓存命中率涨到九成九的那天,我请全组喝了奶茶,预算就出在省下的服务器钱里。我在心里把涉及的所有环节都过了一遍。我在心里给这次的优化目标定了个数,降低一半。我把它写进了组内的避坑文档第一章