- Redis预减库存减少数据库访问
- 内存标记减少Redis访问
- 请求先入队缓冲,异步下单,增强用户体验 RabbitMQ
- Nginx水平扩展
- 数据库分库分表,用于大型数据库的拆分 MyCat
超卖问题
- 数据库加唯一索引:防止用户重复购买
- SQL加库存数量判断:防止库存变成负数
秒杀接口优化
思路:减少数据库访问
- 系统初始化,把商品库存数量加载到Redis
- 收到请求,Redis预减库存,库存不足,直接返回,否则进入3
- 请求入队,立即返回排队中 异步下单
- 请求出队,服务端生成订单写入缓存,减少库存
- 客户端收到排队中会轮询缓存,是否秒杀成功,
第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访问
网友评论