ES(索引数据库)导入MySQL全量(批量导入)和增量数据&&Canal增量数据同步利器

索引库数据管理

秒杀商品数量庞大,我们要想实现快速检索,不建议直接使用关系型数据库查找。不建议使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个不回家的男人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值