JAVA全系列 教程
3762个小节阅读:7092.4k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
管理员在数据库增删改商品后,需要将商品数据同步到ES中,这样用户才能在第一时间搜索到最新数据。写法如下:
在搜索接口实现类编写删除ES商品方法,商品下架后调用该方法
xxxxxxxxxx
// 删除ES中的商品
@Override
public void delete(Long id) {
goodsESRepository.deleteById(id);
}
xxxxxxxxxx
@DubboService
public class GoodsServiceImpl implements GoodsService {
@Autowired
private GoodsMapper goodsMapper;
@Autowired
private GoodsImageMapper goodsImageMapper;
@DubboReference
private SearchService searchService;
@Override
public void add(Goods goods) {
// 插入商品数据
goodsMapper.insert(goods);
// 插入图片数据
Long goodsId = goods.getId(); // 获取商品主键
List<GoodsImage> images = goods.getImages(); // 商品图片
for (GoodsImage image : images) {
image.setGoodsId(goodsId); // 给图片设置商品id
goodsImageMapper.insert(image); //插入图片
}
// 插入商品_规格项数据
// 1.获取规格
List<Specification> specifications = goods.getSpecifications();
// 2.获取规格项
List<SpecificationOption> options = new ArrayList(); //规格项集合
// 遍历规格,获取规格中的所有规格项
for (Specification specification : specifications) {
options.addAll(specification.getSpecificationOptions());
}
// 3.遍历规格项,插入商品_规格项数据
for (SpecificationOption option : options) {
goodsMapper.addGoodsSpecificationOption(goodsId,option.getId());
}
// 将商品数据同步到es中
GoodsDesc goodsDesc = findDesc(goodsId);
searchService.syncGoodsToES(goodsDesc);
}
@Override
public void update(Goods goods) {
// 删除旧图片数据
Long goodsId = goods.getId(); // 商品id
QueryWrapper<GoodsImage> queryWrapper = new QueryWrapper();
queryWrapper.eq("goodsId",goodsId);
goodsImageMapper.delete(queryWrapper);
// 删除旧规格项数据
goodsMapper.deleteGoodsSpecificationOption(goodsId);
// 插入商品数据
goodsMapper.updateById(goods);
// 插入图片数据
List<GoodsImage> images = goods.getImages(); // 商品图片
for (GoodsImage image : images) {
image.setGoodsId(goodsId); // 给图片设置商品id
goodsImageMapper.insert(image); //插入图片
}
// 插入商品_规格项数据
// 1.获取规格
List<Specification> specifications = goods.getSpecifications();
// 2.获取规格项
List<SpecificationOption> options = new ArrayList(); //规格项集合
// 遍历规格,获取规格中的所有规格项
for (Specification specification : specifications) {
options.addAll(specification.getSpecificationOptions());
}
// 3.遍历规格项,插入商品_规格项数据
for (SpecificationOption option : options) {
goodsMapper.addGoodsSpecificationOption(goodsId,option.getId());
}
// 将商品数据同步到es中
GoodsDesc goodsDesc = findDesc(goodsId);
searchService.syncGoodsToES(goodsDesc);
}
@Override
public void putAway(Long id, Boolean isMarketable) {
goodsMapper.putAway(id,isMarketable);
// 上架时数据同步到ES,下架时删除ES数据
if (isMarketable){
GoodsDesc goodsDesc = findDesc(id);
searchService.syncGoodsToES(goodsDesc);
}else {
searchService.delete(id);
}
}
}
在商品同步到ES的功能中,商品服务通过Dubbo调用了搜索服务,这种方式有以下两个问题:
- 服务间耦合严重,即商品服务的启动必须依赖搜索服务。
- 运行效率低,在管理员增删改商品后调用搜索服务会等待响应结果,比较浪费时间。
此时我们可以使用消息队列解决这一问题。即管理员增删改商品后,向消息队列发送消息,搜索服务监听消息,搜索服务拿到消息后同步数据即可。这样既能优化管理员体验,也可以减少服务间的依赖。