当前位置:   article > 正文

java 多线程秒杀_【IDEA+SpringBoot+Java商城秒杀实战20】高并发秒杀接口优化

java 多线程秒杀_【IDEA+SpringBoot+Java商城秒杀实战20】高并发秒杀接口优化

高并发秒杀接口优化

接口优化(核心思路:减少对数据库的访问)

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,就不需要继续往下走,直接返回失败

&#

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号