秒杀:接口优化

  1. Redis预减库存减少数据库访问
  2. 内存标记减少Redis访问
  3. 请求先入队缓冲,异步下单,增强用户体验 RabbitMQ
  4. Nginx水平扩展
  5. 数据库分库分表,用于大型数据库的拆分 MyCat

超卖问题

  1. 数据库加唯一索引:防止用户重复购买
  2. SQL加库存数量判断:防止库存变成负数

秒杀接口优化

思路:减少数据库访问

  1. 系统初始化,把商品库存数量加载到Redis
  2. 收到请求,Redis预减库存,库存不足,直接返回,否则进入3
  3. 请求入队,立即返回排队中 异步下单
  4. 请求出队,服务端生成订单写入缓存,减少库存
  5. 客户端收到排队中会轮询缓存,是否秒杀成功,
    第4、5步并发进行

预减库存带来的问题

//预减库存
        long stock = redisService.decr(GoodsKey.getMiaoShaGoodsStock, ""+goodsId);
        if (stock < 0){
            return Result.error(CodeMsg.MIAO_SHA_OVER);
        }

当库存10,到11个请求时,stock-1,OK;到第12个请求就应该不需要进redis将stock-1了
解决办法
内存标记,减少redis访问

你可能感兴趣的:(秒杀:接口优化)