SpringCloud(十一)- 秒杀 抢购
1、流程图
1.1 数据预热
1.2 抢购
1.3 生成订单 (发送订单消息)
1.4 订单入库 (监听 消费订单消息)
1.5 查看订单状态
1.6 支付 (获取支付链接 )
1.7 支付成功 微信回调 (发送 支付成功消息)
1.8 支付成功 返回给前端成功 (监听 支付成功消息)
2、incr 和 setnx
2.1 incr
Redis Incr 命令将 key 中储存的数字值增一。 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。且将key的有效时间设置为长期有效 。
2.1.1 常见使用场景
2.1.1.1 计数
我们可能常会统计网站页面每天访问量,通过incr命令在redis中设置key,每次增加1,设置24小时过期。
2.1.1.2 限流
日常的开放平台API一般常有限流,利用redis的incr命令可以实现一般的限流操作。如限制某接口每分钟请求次数上限1000次
2.1.1.3 幂等
MQ防止重复消费也可以利用INCR命令实现,如订单防重,订单5分钟之内只能被消费一次,订单号作为redis的key
2.2 sexnx
Redis使用setnx命令实现分布式锁;
2.1.1 加锁
版本一#但是这种方式的缺点是容易产生死锁,因为客户端有可能忘记解锁,或者解锁失败。
setnx key value
版本二#给锁增加了过期时间,避免出现死锁。但这两个命令不是原子的,第二步可能会失败,依然无法避免死锁问题。
setnx key value
expire key seconds
版本三(推荐)#通过“set...nx...”命令,将加锁、过期命令编排到一起,它们是原子操作了,可以避免死锁。
set key value nx ex seconds
2.1.2 解锁
解锁就是删除代表锁的那份数据。
del key
参考博客:https://blog.csdn.net/weixin_45525272/article/details/126562119
3、实现代码
主要是抢购的业务;
3.1模块分析
3.2 web模块
3.2.1 application.yml
点击查看代码
3.2.2 SeckillConfig 配置类
点击查看代码
3.2.3 抢购接口和实现类
3.2.3.1 接口
点击查看代码
3.2.3.2 实现类
点击查看代码
3.2.4 远程调用订单模块进行下单
点击查看代码
3.2.5 抢购 控制层
点击查看代码
3.3 订单模块
3.3.1 application.yml
点击查看代码
3.3.2 OrderMQDirectConfig
点击查看代码
3.3.3 OrderMQConstant
点击查看代码
3.3.4 下订单业务层
3.3.4.1 接口
点击查看代码
3.3.4.2实现类
点击查看代码
3.3.5 SeckillOrderSaveListener
点击查看代码
3.3.6 下单 控制层
点击查看代码
3.4 查询订单状态和订单支付部分不再赘述
4、测试
4.1 初始化库存
4.2 抢购
4.2.1 抢购情况
4.2.2 redis中数据变化情况
4.3 查看订单详情
4.4 订单支付
支付的时候数注意穿透的路径;