SpringBoot秒杀系统实战20-高并发秒杀接口优化

该博客主要介绍了如何利用SpringBoot优化高并发秒杀接口,包括将商品库存预加载到Redis,预减库存,使用RabbitMQ消息队列异步下单。同时讨论了Redis在多线程环境下的安全性,并提供了在Windows上安装RabbitMQ的步骤。
摘要由CSDN通过智能技术生成
文章目录

高并发秒杀接口优化

秒杀业务场景,并发量很大,瓶颈在数据库,怎么解决,加缓存。用户发起请求时,从浏览器开始,在浏览器上做页面静态化直接将页面缓存到用户的浏览器端,然后请求到达网站之前可以部署CDN节点,让请求先访问CDN,到达网站时候使用页面缓存。页面缓存再进一步的话,粒度再细一点的话就是对象缓存。缓存层依次请求完之后,才是数据库。通过一层一层的访问缓存逐步的削减到达数据库的请求数量,这样才能保证网站在大并发之下抗住压力。

但是仅仅依靠缓存还不够,所以还需要进行接口优化。

接口优化核心思路:减少数据库的访问。(数据库抗并发的能力有限)

  • 使用Redis预减库存减少对数据库的访问
  • 使用内存标记减少Redis的访问
  • 使用RabbitMQ队列缓冲,异步下单,增强用户体验

具体实现步骤:

  1. 统初始化,把商品库存数量加载到Redis上面来
  2. 收到请求,Redis预减库存(先减少Redis里面的库存数量,库存不足,直接返回),如果库存已经到达临界值的时候,即=0,就不需要继续往下走,直接返回失败
  3. 请求入队,立即返回排队中
  4. 请求出队,生成订单,减少库存
  5. 客户端轮询,是否秒杀成功

1.商品库存数量预加载库存到Redis上

MiaoshaController实现InitializingBean接口,重写afterPropertiesSet方法。

在容器启动的时候,检测到了实现了接口InitializingBean之后,就回去回调afterPropertiesSet方法。将每种商品的库存数量加载到redis里面去。

@RequestMapping("/miaosha")
@Controller
public class MiaoshaController implements InitializingBean{ 
public void afterPropertiesSet() throws Exception {
    List<GoodsVo> 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<GoodsVo>  getGoodsVoList() {
		return goodsDao.getGoodsVoList();
	}
	}
@Mapper
public interface GoodsDao {
//两个查询
@
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值