这需求对于大家来说很简单吧,伪代码如下:
public Map<String,Object> detail(long goodsId){
//创建一个map
//step1:查询商品基本信息,放入map
map.put(“goodsModel”,(select * from t_goods where id = #gooldsId#));
//step2:查询商品图片列表,返回一个集合放入map
map.put(“goodsImgsModelList”,(select * from t_goods_imgs where goods_id = #gooldsId#));
//step3:查询商品描述信息,放入map
map.put(“goodsExtModel”,(select * from t_goods_ext where goods_id = #gooldsId#));
return map;
}
上面这种写法应该很常见,代码很简单,假设上面每个步骤耗时200ms,此接口总共耗时>=600毫秒,其他还涉及到网络传输耗时,估计总共会在700ms左右,此接口有没有优化的空间,性能能够提升多少?我们一起来挑战一下。
在看一下上面的逻辑,整个过程是按顺序执行的,实际上3个查询之间是没有任何依赖关系,所以说3个查询可以同时执行,那我们对这3个步骤采用多线程并行执行,看一下最后什么情况,代码如下:
package com.itsoku.chat26;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
/**
* 跟着阿里p7学并发,微信公众号:javacode2018
*/
public class Demo1 {
/**
* 获取商品基本信息
* @param goodsId 商品id
* @return 商品基本信息
* @throws InterruptedException
*/
public String goodsDetailModel(long goodsId) throws InterruptedException {
//模拟耗时,休眠200ms
TimeUnit.MILLISECONDS.sleep(200);
return “商品id:” + goodsId + “,商品基本信息…”;
}
/**
* 获取商品图片列表
* @param goodsId 商品id
* @return 商品图片列表
* @throws InterruptedException
*/
public List<String> goodsImgsModelList(long goodsId) throws InterruptedException {
//模拟耗时,休眠200ms
TimeUnit.MILLISECONDS.sleep(200);
return Arrays.asList(“图1”, “图2”, “图3”);
}
/**
* 获取商品描述信息
* @param goodsId 商品id
* @return 商品描述信息
* @throws InterruptedException
*/
public String goodsExtModel(long goodsId) throws InterruptedException {
//模拟耗时,休眠200ms
TimeUnit.MILLISECONDS.sleep(200);
return “商品id:” + goodsId + “,商品描述信息…”;
}
//创建个线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
/**
* 获取商品详情
* @param goodsId 商品id
* @return
* @throws ExecutionException
* @throws InterruptedException
*/
public Map<String, Object> goodsDetail(long goodsId) throws ExecutionException, InterruptedException {
Map<String, Object> result = new HashMap<>();
//异步获取商品基本信息
Future<String> gooldsDetailModelFuture = executorService.submit(() -> goodsDetailModel(goodsId));
//异步获取商品图片列表
Future<List<String>> goodsImgsModelListFuture = executorService.submit(() -> goodsImgsModelList(goodsId));
//异步获取商品描述信息
Future<String> goodsExtModelFuture = executorService.submit(() -> goodsExtModel(goodsId));
result.put(“gooldsDetailModel”, gooldsDetailModelFuture.get());
result.put(“goodsImgsModelList”, goodsImgsModelListFuture.get());
result.put(“goodsExtModel”, goodsExtModelFuture.get());
return result;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
long starTime = System.currentTimeMillis();
Map<String, Object> map = new Demo1().goodsDetail(1L);
System.out.println(map);
System.out.println(“耗时(ms):” + (System.currentTimeMillis() - starTime));
}
}
输出:
{goodsImgsModelList=[图1, 图2, 图3], gooldsDetailModel=商品id:1,商品基本信息…, goodsExtModel=商品id:1,商品描述信息…}
耗时(ms):208
可以看出耗时200毫秒左右,性能提升了2倍,假如这个接口中还存在其他无依赖的操作,性能提升将更加显著,上面使用了线程池并行去执行3次查询的任务,最后通过Future获取异步执行结果。
整个优化过程:
-
先列出无依赖的一些操作
-
将这些操作改为并行的方式
用到的技术有:
总结
这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!
某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!
成功只会留给那些有准备的人!
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!
某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!
成功只会留给那些有准备的人!
[外链图片转存中…(img-XWjq1PbL-1725684777361)]
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0