代码编织梦想

项目场景:

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


实现理解:

秒杀业务流程
如果使用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标记。实现秒杀的性能。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_55648724/article/details/129654416

实现高并发秒杀的七种方式-爱代码爱编程

文章目录 1.引言2.商品秒杀-超卖3. 解决商品超卖3.1 方式一(改进版加锁)3.2 方式二(AOP版加锁)3.3 方式三(悲观锁一)3.4 方式四(悲观锁二)3.5 方式五(乐观锁)3.6 方式六(阻塞队列)3.7.方式七(Disruptor队列)4. 小结 1.引言 高并发场景在现场的日常工作中很常见,特别是在互联网公司中,这篇文章就

商城模块秒杀业务的设计与实战-爱代码爱编程

正文 首先设计一个系统之前,我们需要先确认我们的业务场景是怎么样子的,我们就设计一个便于理解的秒杀场景吧。 场景 我们现场要卖100件下面这个看着些不错的鱼竿,然后我们根据以往这样秒杀活动的数据经验来看,目测来抢这100件鱼竿的人足足有10万人。 你一听,完了呀,这我们的服务器哪里顶得住啊!说真的如果直接对数据库操作肯定挂。但是别急嘛,我们在开始之

秒杀系统简介-爱代码爱编程

1、业务特征: 瞬时售空、限时、限量、限价、持续时间短、流量并发高 2、秒杀技术特征: 单一职责: 秒杀流量是占比比较重的一环,所以要独立部署,与其他业务分开,互不影响。扩容容易。 防止超卖: 100个库存,1000个人购买,如何保证其中100个人能买到 限流、熔断、降级: 主要是防止程序蹦掉。核心就是限制次数、限制总量、快速失败、降级运行

面试-业务-秒杀功能总结-爱代码爱编程

一、架构原则 秒杀系统本质上就是一个满足大并发、高性能和高可用的分布式系统 架构原则: 4要 1不要 数据尽量少:用户请求的数据能少就少,包括上传给系统的数据和系统返回的数据请求数尽量少路径尽量短依赖尽量少 二、动静分离 如何才能做好动静分离?有哪些方案可选? 1、什么是动静数据 以商详页为例,产品的基本信息就是静态数据,像库存这样的或

PHP + Redis抢购秒杀-爱代码爱编程

避免被“灰产党”薅羊毛还是要重视一下这个问题的。 什么是商品超卖? 这个问题其实很好理解,商品超卖说的就是说在同一时间有大量的用户来购买活动商品(一般是打折的商品),本来商品库存只有100,最后却卖出了120件商品,对商家会造成一定的经济损失。那么为什么会出现这样的问题呢?这个其实也很好理解,我们正常情况下的程序逻辑是,用户下单前我们