在秒杀系统中我们如何对接口进行优化呢?
1.Redis预减库存减少数据库的访问
2.内存标记减少Redis的访问
3.请求先入队缓冲(RabbitMQ),异步下单
4. Nginx水平扩展
解决超卖
1.数据库加唯一索引:防止用户重复购买
2.SQL加库存数量判断:防止库存变成负数
1.Redis预减少数据库的访问
整个优化的核心思路还是减少对数据库的访问。具体思路如下
1. 系统初始化,把商品库存数量加载到Redis
2. 收到请求,Redis预减库存,库存不足,直接返回,否则进入3
3. 请求入队,立即返回排队中
4. 请求出队,生成订单,减少库存
5. 客户端轮询,是否秒杀成功
首先我们实现,在系统初始化的适合,就将商品的库存数量加载进Redis中。这里我们可以使用到Spring中的InitializingBean接口,这个接口实现的afterPropertiesSet()方法,会在Bean刚被加载的适合就直接被调用,具体可以看我Spring spring中InitializingBean接口和ApplicationContextAware接口这篇博文。
使用afterPropertiesSet()方法,将商品库存存入redis
/**
* 系统初始化
* */
public void afterPropertiesSet() throws Exception {
List<GoodsVo> goodsList = goodsService.listGoodsVo();
if(goodsList == null) {
return;
}
for(GoodsVo goods : goodsList) {
redisService.set(GoodsKey.getMiaoshaGoodsStock, ""+goods.getId(), goods.getStockCount());
localOverMap.put(goods.getId(), false);
}
}