先来三张图,说一下具体的思路
1、交易流程
2、rocketmq部署
3、一致性
可算是被坑死了,待我细细道来:晕了一下午,明天捋一捋思路。
首先通过jmeter压测发现,下单接口频繁进行数据库查询导致平均响应时间0.5s左右,tps400,所以我们就考虑使用redis做缓存,对商品对象,user对象进行缓存,修改原先商品查询和用户查询接口:
@Override
public ItemModel getItemByIdInCache(Integer id) {
ItemModel itemModel = (ItemModel) redisTemplate.opsForValue().get("item_id" + id);
if (itemModel == null) {
itemModel = this.getItemById(id);
redisTemplate.opsForValue().set("item_id" + id,itemModel);
redisTemplate.expire("item_id" + id, 10, TimeUnit.MINUTES);
}
return itemModel;
}
@Override
public UserModel getUserByIdInCache(String id) {
UserModel userModel = (UserModel) redisTemplate.opsForValue().get("user_id" + id);
if (userModel == null) {
userModel = this.getUserById(id);
redisTemplate.opsForValue().set("user_id" + id, userModel);
redisTemplate.expire("user_id" + id, 10, TimeUnit.MINUTES);
}
return userModel;
}
修改下单接口:
@Override
@Transactional
public OrderModel createOrder(String userId, Integer itemId, Integer promoId, Integer amount) throws BusinessException {
// 校验 商品存在 用户合法 数量正确
// ItemModel itemModel = itemService.getItemById(itemId);
ItemModel itemModel = itemService.getItemByIdInCache(itemId);
if (itemModel == null) {
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "商品信息不正确");
}
// UserModel userModel = userService.getUserById(userId);
UserModel userModel = userService.getUserByIdInCache(userId);
if (userModel == null) {
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "用户信息