秒杀的理解

项目场景:

秒杀限时或者限量的处理一件商品


实现理解:

秒杀业务流程
如果使用java逻辑判断减库存的话,会出现多个线程同时修改好库存,然后存入相同的修改值
实际上是卖出了多个 但是数据库只扣了一个库存,首先前台传进来商品ID,减库存(使用sql语句的stock=stock-1  这个会触发mysql的行级锁 适用于高并发的场景)。


 

 秒杀的高并发实现:利用Redis,来作为一级缓存。把商品id和库存放到redis里。使用stringRedisTemple.opsForValue().set(商品ID号,库存);设置进redis。然后,秒杀下单的时候传入商品ID号,自动递减redis里面的商品库存。stringRedisTemple.opsForValue().decrement(id号); 但是,这样会出现问题。

比如:下单异常的时候会出现redis和mysql扣的库存不一致。解决方法就是在处理异常的地方添加还原redis库存数量。stringRedisTemple.opsForValue().increment(id号);但是,这样还有可能在高并发时出现少买的情况,解决就是在比对redis里面的库存,判断库存小于0的时候,也添加还原库存的代码。

这样问题差不多都解决了。但是每次都要判断如果刚好最后一个进入多个线程,同样也要判断好多次,浪费资源,这时候可以使用jvm缓存同步。使用JUC标记。

private static concurrentHashMap<Long,Boolean> StockOut=new concurrentHashMap<>();

 在判断库存小于0的逻辑代码内,标记该商品号已售出为true.然后在进入这个判断之前直接判断该标记。这样提升了单体应用秒杀时候的并发量。如果是分布式的服务的话,因为每个服务的jvm不一样,无法同步在异常处理的时候还原该标记。我们可以使用队列(RabbitMq),来实现分布式服务的同步修改JVM标记。实现秒杀的性能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值