在服务端性能优化的时候,有一种方案叫 “异步写入”。就是把原本要写入数据库的功能放到异步来作,跟异步查询转同步的区别在于,异步查询是要等结果的,而异步写入则能够不等返回结果,甚至直接把写入任务丢到一个专门的任务队列中。数据库
在对于实时性要求并不高的业务来说,这是一个很是值得推荐的方法,好比用户消费了一笔金额场景中,对于用户消费信息的记录以及消费带来的积分提高、会员等级提高均可以异步来实现。平常接触最多的异步应该是日志和打点系统,几乎没有见过非异步实现的方案。编程
异步写入带来的另一个问题就是 “延迟”,通常开发会给出一些延迟的参数值,可是在性能测试过程当中这个值可能会很是大,甚至超出用户的可接受范围。这个时候就须要测试 延迟在不用压力状况下的数值大小,以便给出最好的服务负载数据。性能优化
下面分享一个检测用户更改我的信息的接口的延迟测试方案:框架
package com.okayqa.teacherpad import com.fun.utils.RString import com.okayqa.teacherpad.base.OkayBase import com.okayqa.teacherpad.function.UserInfo class T extends OkayBase { public static void main(String[] args) { def base = getBase() def info = new UserInfo(base) def total = [] def diff = [] 100.times { def uname = RString.getString(5) def result = info.updateInfo(1, uname) int i; if (isRight(result)) { def mark0 = getNanoMark() while (true) { def mark00 = getNanoMark() def userinfo = info.getUserInfo() def mark01 = getNanoMark() diff << mark01 - mark00 if (userinfo.getUserInfo().getString("uname") == uname) break; if (i++ > 5) break } def mark1 = getNanoMark() total << mark1 - mark0 } else { fail() } } //求平均值的两种方法 def var = diff.sum() / diff.size() def average = total.stream().mapToInt().average(); output "单次修改信息延迟约${average - var / 2}" } }
上面的参数能够根据实际大小来调整,一边压测一边另起进程测试写入接口的延迟状况。异步