性能优化之缓存

    最近在做一个模拟股票系统,系统开发已经接近尾声了,是该到了对系统进行性能测试及性能优化的时候了。
    于是用ab对系统进行冲击,我以100/sec的速度发送1000个请求,请求命令如下:
ab -n 1000 -c 100 -C sid=f6ea35fc-855a-47bb-9ef1-fe7133b7d423 http://localhost:8090/front/stockManage/proList.action?_=1335603896628



完成1000个请求处理需要31sec,这个结果显然无法按受。

    于是把log设为error级,打开数据库监控,根据数据库优化顾问结果把索引建上再发动冲击
结果如下


发现性能没有提高反而下降了,平均最快的50%都能在2.828秒处理完,但最长的需在6.578秒,
最长处理请求明显无法接受;
    分析代码,在代码中有这么一段,就是把本地股票代码查询出来后要发http请求到sina股票数据接口去查询实时价格,如果在我们的代码中一下子发送100个http请求,请求需要排队的,所以整体性能都很慢,并且网络的IO速度肯定比本地要慢,所以必须要把数据缓存起来以减少http请求,那么整体性能将大大提高,由于价格是动态,所以我只将数据缓存10秒,

@Override
	public List<StockActivity> initStockInfo(String code) {
		
		List<StockActivity> list=(List<StockActivity>)cacheService.get(code);
		if(list!=null){
			return list;
		}
		String result = new HttpComment().access(String.format(
				DATA_REQUEST_URL, code), null);
		String[] acts = result.split(";");
		list = new ArrayList<StockActivity>();
		for (int i = 0; i < acts.length; i++) {
			list.add(stockParser(acts[i]));
		}
		cacheService.set(code, 10, list);
		return list;
	}


再次对系统进行冲击结果如下:




加了缓存之后最大处理时间为4.296秒,有了明显的提高,但是这样做同样带来的问题,就是在并发量很少的时候会有很多数据缓存后10秒钟到期被替换出去,这样缓存命中率就会严重下降。


猜你喜欢

转载自qnlpkuge.iteye.com/blog/1504036