day1 2020.8.6 21.27
压力测试
秒杀定义
- 在高并发的情况下,购买某个商品,从而下订单。
秒杀问题
- 超卖,一件商品卖给了多个人
- 保证用户体验
保护流程(要有先后顺序)
- 最核心基础问题:超卖
- 优化系统,提高吞吐量:令牌桶限流、Redis缓存、消息队列异步处理订单
超卖问题
1.概念
2. 业务场景
首先要接收来自用户的秒杀请求参数,然后将参数交给业务层,业务层拿到参数之后,首先去数据库中找相应商品的库存信息。若有库存,则减库存,然后为用户创建订单,如果没有库存,则拒绝用户请求。
3. 解决方案
第一种–悲观锁:
第一种方式:在方法中加上synchronized,相当于加上了悲观锁,拥有锁才可以更改资源(和@Transactional一起使用会有问题),所以要将synchronized放在控制器调用的地方。
缺点1:会让线程排队,一个一个执行。系统效率、用户体验
缺点2:JDK级别的锁仅在JVM进程下有效,控制不了集群架构或者分布式架构的资源增强问题。
需要了解的知识点:@事务、同步代码块、悲观锁、乐观锁
第二种–乐观锁:
当利用mysql分布式锁的时候,插入或者更新一个字段的时候,就自动加锁。如果不设置版本号,则其他的会在固定时间一直访问该资源,在这儿加上了版本号,当自己的版本号不一致的时候,自动拒绝这些请求,减少了资源的浪费。
第三种–Redis分布式锁
接口限流
Redis缓存(设置过期时间)
消息队列
不丢失错误