秒杀具有瞬间高并发的特点,针对这一特点,必须要做限流+异步+缓存(页面静态化)+独立部署
秒杀系统设计思路
- 项目独立部署,独立秒杀模块gulimall-seckill
- 使用定时任务每天三点上架最新秒杀商品,削减高峰期压力
- 秒杀链接加密,为秒杀商品添加唯一商品随机码,在开始秒杀时才暴露接口
- 库存预热,先从数据库中扣除一部分库存以redisson信号量的形式存储在redis中
- 队列削峰,秒杀成功后立即返回,然后以发送消息的形式创建订单


本文采用的秒杀流程

1-秒杀逻辑
- 去除reids商品信息,校验商品秒杀时间,校验商品随机码
- 验证商品库存
- 验证这个人是否已经买过了(幂等性处理),如果秒杀成功,就去占位。
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);- 设置库存的地方:使用库存作为分布式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毫

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

被折叠的 条评论
为什么被折叠?



