对于高并发我们以最常见最具代表性的商城商品详情页为例,来看看我们如何从最简单的crud进行优化的。
1.直接访问数据库
我们直接访问数据库。
public PmsProductParam getProductInfo1(Long id) {
PmsProductParam productInfo = portalProductDao.getProductInfo(id);
if (null == productInfo) {
return null;
}
FlashPromotionParam promotion = flashPromotionProductDao.getFlashPromotion(id);
if (!ObjectUtils.isEmpty(promotion)) {
productInfo.setFlashPromotionCount(promotion.getRelation().get(0).getFlashPromotionCount());
productInfo.setFlashPromotionLimit(promotion.getRelation().get(0).getFlashPromotionLimit());
productInfo.setFlashPromotionPrice(promotion.getRelation().get(0).getFlashPromotionPrice());
productInfo.setFlashPromotionRelationId(promotion.getRelation().get(0).getId());
productInfo.setFlashPromotionEndDate(promotion.getEndDate());
productInfo.setFlashPromotionStartDate(promotion.getStartDate());
productInfo.setFlashPromotionStatus(promotion.getStatus());
}
return productInfo;
}
当我们的单机访问量过大,必然会降低我们的吞吐量,延长我们的访问时间,甚至可能造成数据库连接超时的报错。
记录下我们的压测结果,并且能够看到我们存在7.16%的异常值,说明出现了数据库连接超时的报错。
2.引入redis作为缓存
直接上代码,我们先从redis中取,如果拿不到的话再去查询数据库并设置redis,拿到了就直接返回。这里需要注意一点,就是我们在设置redis时要设置超时时间,以保证数据库和redis的最终一致性,如果想要保证时时一致性的话,可以使用canal。
public PmsProductParam getProductInfo(Long id){
PmsProd