6 同步数据

6.1 索引库同步

​ 当tb_sku秒杀商品发生变化时,我们应该同时变更索引库中的索引数据,比如秒杀商品增加,则需要同步增加秒杀商品的索引,如果有秒杀商品删除,则需要同步移除秒杀商品。

修改seckill-canal中的com.seckill.handler.SkuHandler的增删改方法,代码如下:

@Component
     @CanalTable(value = "tb_sku")
     public class SkuHandler implements EntryHandler<Sku> {
      @Autowired
      private SkuInfoFeign skuInfoFeign;
      /***
      * 增加数据
      * @param sku
      **/
      @Override
      public void insert(Sku sku)
      {
      //将Sku转换成SkuInfo
      SkuInfo skuInfo = JSON.parseObject( JSON.toJSONString(sku) ,SkuInfo.class);
      //同步索引
      skuInfoFeign.modify(1,skuInfo);
      }
      /***
      * 修改数据
      * @param before
      * @param after
      * */
      @Override
      public void update(Sku before, Sku after)
      {
      int type=2; //将Sku转换成SkuInfo
	  SkuInfo skuInfo = JSON.parseObject( JSON.toJSONString(after) ,SkuInfo.class);
      if(skuInfo.getStatus()==1 || after.getSeckillNum()<=0)
      {
      //商品变成了普通商品,或者商品库存为0,则需要删除索引数据
      type=3;
      }
      //同步索引
      skuInfoFeign.modify(type,skuInfo);
      } /***
      * 删除数据
      * @param sku
      * */
      @Override public void delete(Sku sku) { //将Sku转换成SkuInfo
      SkuInfo skuInfo = JSON.parseObject( JSON.toJSONString(sku) ,SkuInfo.class);
      //同步索引
      skuInfoFeign.modify(3,skuInfo);
      }
      }

开启Feign功能:@EnableFeignClients(basePackages = {"com.seckill.search.feign"})

此时对数据库中tb_sku表进行增删改的时候,会同步到索引库中。

6.2 静态页同步

​ 只需要添加Feign包,注入SkuPageFeign,根据增删改不同的需求实现生成静态页或删除静态页。修改SkuHandler,代码如下:

@Component
@CanalTable(value = "tb_sku")
public class SkuHandler implements EntryHandler<Sku> {
 
    @Autowired
    private SkuInfoFeign skuInfoFeign;
 
    @Autowired
    private SkuPageFeign skuPageFeign;
 
    /***
     * 增加数据
     * @param sku
     */
    @SneakyThrows
    @Override
    public void insert(Sku sku) {
        //将Sku转换成SkuInfo
        SkuInfo skuInfo = JSON.parseObject( JSON.toJSONString(sku) ,SkuInfo.class);
        //同步索引
        skuInfoFeign.modify(1,skuInfo);
 
        //生成静态页
        skuPageFeign.html(sku);
    }
 
    /***
     * 修改数据
     * @param before
     * @param after
     */
    @SneakyThrows
    @Override
    public void update(Sku before, Sku after) {
        int type=2;
        //将Sku转换成SkuInfo
        SkuInfo skuInfo = JSON.parseObject( JSON.toJSONString(after) ,SkuInfo.class);
        if(skuInfo.getStatus()==1 || after.getSeckillNum()<=0){
            //商品变成了普通商品,或者商品库存为0,则需要删除索引数据
            type=3;
        }
        //同步索引
        skuInfoFeign.modify(type,skuInfo);
 
        if(type==3){
            //删除静态页
            skuPageFeign.delHtml(after.getId());
        }else{
            //生成静态页
            skuPageFeign.html(after);
        }
    }
 
    /***
     * 删除数据
     * @param sku
     */
    @SneakyThrows
    @Override
    public void delete(Sku sku) {
        //将Sku转换成SkuInfo
        SkuInfo skuInfo = JSON.parseObject( JSON.toJSONString(sku) ,SkuInfo.class);
        //同步索引
        skuInfoFeign.modify(3,skuInfo);
 
        //删除静态页
        skuPageFeign.delHtml(sku.getId());
    }
}

同时不要忘了添加feign包: @EnableFeignClients(basePackages={"com.seckill.search.feign","com.seckill.page.feign"})

测试的时候,在数据对数据进行增删改,静态页也会同步操作。