索引库数据管理
秒杀商品数量庞大,我们要想实现快速检索,不建议直接使用关系型数据库查找。不建议使用Redis缓存所有数据,因为秒杀商品量大,会影响Redis的性能,并且Redis的条件检索能力偏弱。我们可以使用Elasticsearch,它在海量数据存储与检索上,能力卓越,市场使用面广。
查询MySQL数据
我们需要将秒杀商品数据导入到ES索引库中,但秒杀商品数量庞大,所以我们应该分页查询并导入,流程如下:
1)service总数量查询
我们先在seckill-goods中编写相关方法实现数据查询,因为要用到分页,所以先查询总数量,然后再实现分页集合查询。
在seckill-goods的com.seckill.goods.service.SkuService中添加count方法,用于查询秒杀商品总数量:
/**
* 总数量加载
* @return
*/
Integer count();
在seckill-goods的com.seckill.goods.service.impl.SkuServiceImpl中添加count方法,用于实现查询秒杀商品总数量:
/**
* 总数量加载
* @return
*/
@Override
public Integer count() {
Example example = new Example(Sku.class);
Example.Criteria criteria = example.createCriteria();
//秒杀剩余商品数量>0
criteria.andGreaterThan("seckillNum",0);
//状态为参与秒杀,1:普通商品,2:参与秒杀
criteria.andEqualTo("status","2");
//秒杀结束时间>=当前时间
criteria.andGreaterThanOrEqualTo("seckillEnd",new Date());
return skuMapper.selectCountByExample(example);
}
在seckill-goods的com.seckill.goods.controller.SkuController中添加count方法,用于实现查询秒杀商品总数量:
/***
* Sku数量加载
* @return
*/
@PostMapping(value = "/count" )
public Integer count(){
return skuService.count();
}
2)service分页集合数据查询
在seckill-goods的com.seckill.goods.service.SkuService中添加list方法,用于查询秒杀商品:
/***
* 分页加载
* @param page
* @param size
* @return
*/
List<Sku> list(int page, int size);
在seckill-goods的com.seckill.goods.service.impl.SkuServiceImpl中添加list方法,用于实现查询秒杀商品:
/***
* 分页加载
* @param page
* @param size
* @return
*/
@Override
public List<Sku> list(int page, int size) {
//分页
PageHelper.startPage(page,size);
//条件构建
Example example = new Example(Sku.class);
Example.Criteria criteria = example.createCriteria();
//秒杀剩余商品数量>0
criteria.andGreaterThan("seckillNum",0);
//状态为参与秒杀,1:普通商品,2:参与秒杀
criteria.andEqualTo("status","2");
//秒杀结束时间>=当前时间
criteria.andGreaterThanOrEqualTo("seckillEnd",new Date());
return skuMapper.selectByExample(example);
}
在seckill-goods的com.seckill.goods.controller.SkuController中添加list方法,用于实现查询秒杀商品:
/***
* Sku分页条件加载
* @param page
* @param size
* @return
*/
@GetMapping(value = "/list/{page}/{size}" )
public List<Sku> list(@PathVariable int page, @PathVariable int size){
//调用SkuService实现分页条件查询Sku
List<Sku> skus = skuService.list(page, size);
return skus;
}
3)Feign接口编写
在seckill-goods-api的com.seckill.goods.feign.SkuFeign中编写feign方法,分别调用刚才的count、list方法,代码如下:
/***
* Sku数量加载
* @return
*/
@PostMapping(value = "/sku/count" )
Integer count();
/***
* Sku分页条件加载
* @param page
* @param size
* @return
*/
@GetMapping(value = "/sku/list/{page}/{size}" )
List list(@PathVariable(value ="page") Integer page, @PathVariable(value = "size")Integer size);
集成SpringData Elasticsearch实现索引导入流程:
1.配置Elasticsearch地址信息
2.编写Dao代码,继承ElasticsearchRepository<T,ID>
3.在Service中分页调用查询秒杀商品集合
4.分页导入秒杀商品集合数据到Elasticsearch中
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
当前项目已经集成好了SpringDataElasticsearch,我们只需要实现相关的操作过程即可。
bootstrap.yml添加es配置:
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: es-server:9300
将数据添加到索引库,需要先创建一个能体现索引库的JavaBean映射对象,将要保存到索引库的数据赋值给JavaBean,利用API将JavaBean保存到索引库。
我们首先编写一个和索引库中一一对应的实体Bean,代码如下:
@Document(indexName = "goodsindex",type = "skuinfo")
public class SkuInfo implements Serializable