秒杀下单和上一章的区别在于:秒杀订单需要做单独的高并发处理,同一时间,出现大量请求。并且它有单独的数量,需要单独校验。
首先定义一个名为limiter的RateLimiter(Guava限流器);令牌桶算法!!!
在业务逻辑层添加一个方法:afterPropertiesSet() 。加上@Override注解,等当前的bean加载完成后会执行这个方法
设定limter初始值为RateLimiter.create(10);//10就是令牌桶中最多存放10个令牌。每秒请求不超过10个
下面是秒杀订单的下单逻辑:
在方法上添加@Transactional注解
方法参数为Orders(订单),返回也是订单
在方法中:
首先设置阻塞,限制秒杀请求 limiter.acquire();
获取当前登录用户信息;
将用户Id设为锁,并放入ConcurrentHashMap中;
以下内容将加锁:synchronized(lock)
从订单信息中获取商品Id;
在商品表中判断是否找到商品?商品库存是否满足本次订单?
更新商品表中的库存;
设置当前订单的商品名称、商品图片、商品单价、下单数量;
计算总价:商品单价*数量;
将订单状态设为“未支付”;
用雪花算法定义订单唯一标识(订单编号);
设置当前时间为下单时间;
设置下单用户为当前登录用户;
将订单数据添加到订单表中;
锁中逻辑结束;
异步记录秒杀下单日志;
将ConcurrentHashMap中的用户id移除,解锁;
返回当前订单。