商品秒杀(reids秒杀逻辑 rabbitMQ队列削峰)

该文章介绍了如何设计一个秒杀系统,包括独立部署秒杀模块,使用定时任务预加载商品,加密链接,库存预热并利用Redisson信号量进行限流,以及通过RabbitMQ实现队列削峰和订单创建的异步处理。同时,文中提到了幂等性处理确保用户多次请求的正确性,并提供了部分关键代码示例。

秒杀具有瞬间高并发的特点,针对这一特点,必须要做限流+异步+缓存(页面静态化)+独立部署

秒杀系统设计思路

  • 项目独立部署,独立秒杀模块gulimall-seckill
  • 使用定时任务每天三点上架最新秒杀商品,削减高峰期压力
  • 秒杀链接加密,为秒杀商品添加唯一商品随机码,在开始秒杀时才暴露接口
  • 库存预热,先从数据库中扣除一部分库存以redisson信号量的形式存储在redis中
  • 队列削峰,秒杀成功后立即返回,然后以发送消息的形式创建订单
     

 

本文采用的秒杀流程 

 1-秒杀逻辑

  1. 去除reids商品信息,校验商品秒杀时间,校验商品随机码
  2. 验证商品库存
  3. 验证这个人是否已经买过了(幂等性处理),如果秒杀成功,就去占位。
       
                    1. SETNX 原子性处理,设置key :userId-sessionId-skuId
                        String redisKey = user.getId() + "-" + skuId;
                        2. 设置自动过期(活动结束时间-当前时间)
                        Long ttl = endTime - currentTime;
                        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(redisKey, num.toString(), ttl, TimeUnit.MILLISECONDS);  

  4. 设置库存的地方:使用库存作为分布式Redisson信号量(限流) 
            //如果当前这个场次的商品库存信息已经上架就不需要上架
                        //5、使用库存作为分布式Redisson信号量(限流)
                        // 使用库存作为分布式信号量
                        RSemaphore semaphore = redissonClient.getSemaphore(SKU_STOCK_SEMAPHORE + token);
                        // 商品可以秒杀的数量作为信号量
                        semaphore.trySetPermits(seckillSkuVo.getSeckillCount());

    信号量获取库存:库存存在即可秒杀

    if (aBoolean) {
                            //1-占位成功说明从来没有买过,分布式锁(获取信号量-1)
                            RSemaphore semaphore = redissonClient.getSemaphore(SKU_STOCK_SEMAPHORE + randomCode);
                           //2-tryAcquire  试着去取出,设置100毫
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

syfjava

请博主喝杯蜜雪冰城

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值