案例详解
电商app中,商品详情页,开发一个接口提供以下信息
- 商品基本信息(名称、价格、库存等)
- 商品图片列表
- 商品描述信息
数据库中我们用了3张表存储上面的信息
- 商品基本信息表:t_goods(字段:id、名称、价格、库存等)
- 商品图片信息表:t_goods_imgs(字段:id、goods_id、图片路径等)
- 商品描述信息表:t_goods_ext(字段:id、goods_id、描述信息等)
常规写法,伪代码如下:
public Map<String,Object> detail(long goodsId) {
//创建一个map
Map<String,Object> map = new HashMap<>();
//step1:查询商品基本信息,放入map
map.put("goodsModel",(select * from t_goods where id = #goodsId#));
//step2:查询商品图片列表,返回一个集合放入map
map.put("goodsImgsModelList",(select * from t_goods_imgs where goods_id = #goodsId#));
//step3:查询商品描述信息,放入map
map.put("goodsExtModel",(select * from t_goods_ext where goods_id = #goodsId#));
return map;
}
这种写法很简单,假设上面每个步骤耗时500ms
,此接口总耗时 >=1500ms
,其它涉及到网络传输耗时,估计总共在1600ms
左右
我们看一下上面的逻辑,整个过程是按照顺序执行的,实际上3个查询之间是没有任何依赖关系的,所以说,3个查询可以同时执行
使用多线程对代码进行重构:
package thread.demo;
import