1、最近项目的情况
商品秒杀
秒杀开始前,启动一个rabbitmq的延迟队列。在时间到点后,把数据库中的秒杀商品库存放到redis的缓存中,在用户刷新页面的时候,返回开启秒杀的标记,秒杀开始前页面的按钮是灰色的,不会发送下单接口,会请求秒杀开启的接口,接口返回秒杀开启时间,是否开启等信息
前端限流
设置用户点击后,等待1秒,并且后端没有返回前一个请求结果的时候,无法进行第二次点击,最长间隔五秒后自动解除。
后端限流
每个用户只能在一定时间内秒杀一次,设置为10秒,具体的作用是使用redis的键过期策略,setnx 定时过期,已经设置过值的不能再次设置,
- redis中获取库存key
- 使用watch 监视库存key
- 获取库存查看秒杀是否开始,没有开始则直接返回给前端
- 判断set中是否存在该用户id,判断是否已经秒杀成功,有值则直接返回给前端
- 判断商品数量,库存小于1则秒杀结束
- 执行multi 开启redis事务,然后进行库存扣减和存入用户id的操作
- 执行事务,结束watch
- 返回给前端是否秒杀成功
- redis执行成功一个支付秒杀,就在mq中启动一个消息去处理后续的订单操作,这个时候mysql 里边的库存也会减少。