赞
踩
高并发秒杀接口优化
接口优化(核心思路:减少对数据库的访问)
Redis预减库存减少对数据库的访问
内存标记减少Redis的访问
请求先入队缓冲,异步下单,增强用户体验
RabbitMQ安装与SpringBoot的集成(目的:同步下单改成异步下单)
Nginx水平拓展
压测
项目迭代是一个优化和调整的过程,发现问题解决问题,不断优化。
秒杀业务场景,并发量很大,瓶颈在数据库,怎么解决,加缓存。用户发起请求时,从浏览器开始,在浏览器上做页面静态化直接将页面缓存到用户的浏览器端,然后请求到达网站之前可以部署CDN节点,让请求先访问CDN,到达网站时候使用页面缓存。页面缓存再进一步的话,粒度再细一点的话就是对象缓存。缓存层依次请求完之后,才是数据库。通过一层一层的访问缓存逐步的削减到达数据库的请求数量,这样才能保证网站在大并发之下抗住压力。
但是仅仅依靠缓存还不够,还需要进行接口优化。
秒杀接口优化大致实现步骤:
系统初始化,把商品库存数量加载到Redis
收到请求,Redis预减库存(先减少Redis里面的库存数量,库存不足,直接返回),如果库存已经到达临界值的时候,即=0,就不需要继续往下走,直接返回失败,否正进入3
请求入队,立即返回排队中
请求出队,生成订单,减少库存
客户端轮询,是否秒杀成功
1.商品库存数量预加载库存到Redis上
MiaoshaController实现InitializingBean接口,重写afterPropertiesSet方法。
目的: 在容器启动的时候,检测到了实现了接口InitializingBean之后,就回去回调afterPropertiesSet方法。将每种商品的库存数量加载到redis里面去。
@RequestMapping("/miaosha")
@Controller
public class MiaoshaController implements InitializingBean{
public void afterPropertiesSet() throws Exception {
List goodslist=goodsService.getGoodsVoList();
if(goodslist==null) {
return;
}
for(GoodsVo goods:goodslist) {
//如果不是null的时候,将库存加载到redis里面去 prefix---GoodsKey:gs , key---商品id, value
redisService.set(GoodsKey.getMiaoshaGoodsStock, ""+goods.getId(), goods.getStockCount());
}
}
}
@Service
public class GoodsService {
public static final String COOKIE1_NAME_TOKEN="token";
@Autowired
GoodsDao goodsDao;
@Autowired
RedisService redisService;
public List getGoodsVoList() {
return goodsDao.getGoodsVoList();
}
}
@Mapper
public interface GoodsDao {
//两个查询
@Select("select g.*,mg.stock_count,mg.start_date,mg.end_date,mg.miaosha_price from miaosha_goods mg left join goods g on mg.goods_id=g.id")
public List getGoodsVoList();
}
2.收到请求后预减库存
后端接收秒杀请求的接口doMiaosha,收到请求,Redis预减库存(先减少Redis里面的库存数量,库存不足,直接返回),如果库存已经到达临界值的时候,即=0,就不需要继续往下走,直接返回失败
&#
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。