3 索引库数据管理
Elasticsearch基础学习: 学成在线-课程预览及课程发布 Elasticsearch研究v1.2
秒杀商品数量庞大,我们要想实现快速检索,不建议直接使用关系型数据库查找。不建议使用Redis缓存所有数据,因为秒杀商品量大,会影响Redis的性能,并且Redis的条件检索能力偏弱。我们可以使用Elasticsearch,它在海量数据存储与检索上,能力卓越,市场使用面广。
3.1 批量导入
我们需要将秒杀商品数据导入到ES索引库中,但秒杀商品数量庞大,所以我们应该分页查询并导入,流程如下:
1)service总数量查询
我们先在seckill-goods
中编写相关方法实现数据查询,因为要用到分页,所以先查询总数量,然后再实现分页集合查询。
在seckill-goods
的com.seckill.goods.service.SkuService
中添加count方法,用于查询秒杀商品总数量:
在seckill-goods
的com.seckill.goods.service.impl.SkuServiceImpl
中添加count方法,用于实现查询秒杀商品总数量:
在seckill-goods
的com.seckill.goods.controller.SkuController
中添加count方法,用于实现查询秒杀商品总数量:
2)service分页集合数据查询
在seckill-goods
的com.seckill.goods.service.SkuService
中添加list方法,用于查询秒杀商品:
在seckill-goods
的com.seckill.goods.service.impl.SkuServiceImpl
中添加list方法,用于实现查询秒杀商品:
在seckill-goods
的com.seckill.goods.controller.SkuController
中添加list方法,用于实现查询秒杀商品:
3)Feign接口编写
在seckill-goods-api
的com.seckill.goods.feign.SkuFeign
中编写feign方法,分别调用刚才的count、list方法,代码如下:
4)批量导入实现
数据添加到数据库:
1 1.将数据接到,并转成JavaBean->数据库表中对应的一个JavaBean
2.调用API,把JavaBean保存到数据库
将数据添加到索引库,流程和上面类似,也需要先创建一个能体现索引库的JavaBean映射对象,将要保存到索引库的数据赋值给JavaBean,利用API将JavaBean保存到索引库。
我们首先编写一个和索引库中一一对应的实体Bean,代码如下:
集成SpringData Elasticsearch实现索引导入流程:
1.配置Elasticsearch地址信息
2.编写Dao代码,继承ElasticsearchRepository<T,ID>
3.在Service中分页调用查询秒杀商品集合
4.分页导入秒杀商品集合数据到Elasticsearch中
当前项目已经集成好了SpringDataElasticsearch,我们只需要实现相关的操作过程即可。
bootstrap.yml添加es配置:
创建dao
在seckill-search
的com.seckill.search.service.SkuInfoService
中编写导入索引,代码如下:
在seckill-search
的com.seckill.search.service.impl.SkuInfoServiceImpl
中编写导入索引,代码如下:
注意:我们可以发现下面这段代码以后在其他地方有可能也会用得着,我们可以把它单独抽取出一个方法来:
抽取后:
在seckill-search
的com.seckill.search.controller.SearchController
中编写导入索引,代码如下:
4)测试
启动seckill-goods
、seckill-search
、seckill-gateway
,访问刚才编写的批量导入的方法,访问地址:http://localhost:8001/api/search/all/add
3.2 增量导入
增量导入,也就是某个商品设置成秒杀商品的时候,或者发生变更的时候,能实现增量备份(只将修改的数据同步修改索引库),所以我们还需要实现单个商品导入索引库,我们可以在变更方法(增删改)中调用这边同步方法,但随着系统的增加,这种方法容易有漏网之鱼,我们可以采用canal实现数据库增量监听,然后调用seckill-search
的单个操作方法。
1)索引操作方法编写
在seckill-search
的com.seckill.search.service.SkuInfoService
中添加modify方法,代码如下:
在seckill-search
的com.seckill.search.service.impl.SkuInfoServiceImpl
中添加modify实现方法,代码如下:
在seckill-search
的com.seckill.search.controller.SkuInfoController
中添加modify方法,代码如下:
2)Feign接口编写
在seckill-search-api
中编写Feign接口,实现调用modify方法,代码如下:
3.3 商品搜索
根据秒杀页面的需求,多数是查询指定秒杀时段下的秒杀商品,同时还会有分页,当然,如果有复杂的查询,我们Elasticsearch也都满足。我们可以根据多数秒杀需求,实现按照秒杀时段分页查询数据。
编写Dao
编写Servicecom.seckill.search.service.SkuInfoService
创建搜索方法,代码如下:
编写Servicecom.seckill.search.service.impl.SkuInfoServiceImpl
创建搜索实现方法,代码如下:
编写Servicecom.seckill.search.controller.SearchController
创建搜索方法调用,代码如下: