当前位置: 首页 > news >正文

秒杀系统架构设计

系列导读:本篇将深入讲解秒杀系统的架构设计与核心实现。


文章目录

    • 目录
    • 一、秒杀系统特点
      • 1.1 业务特点
      • 1.2 技术挑战
    • 二、架构设计
      • 2.1 整体架构
      • 2.2 流量削峰
    • 三、核心实现
      • 3.1 库存预热
      • 3.2 秒杀核心逻辑
      • 3.3 异步下单
    • 四、防刷策略
      • 4.1 验证码
      • 4.2 限流
      • 4.3 黑名单
    • 总结

目录

  • 一、秒杀系统特点
  • 二、架构设计
  • 三、核心实现
  • 四、防刷策略
  • 总结

一、秒杀系统特点

1.1 业务特点

┌─────────────────────────────────────────────────────────────┐ │ 秒杀系统特点 │ ├─────────────────────────────────────────────────────────────┤ │ 🌊 瞬时高并发:流量瞬间爆发 │ │ 📦 库存有限:商品数量有限 │ │ ⏰ 时间限制:固定时间段 │ │ 🎯 低价诱惑:吸引大量用户 │ └─────────────────────────────────────────────────────────────┘

1.2 技术挑战

挑战说明
高并发瞬间流量巨大
超卖库存不能超卖
防刷防止机器刷单
稳定性系统不能崩溃

二、架构设计

2.1 整体架构

┌─────────────────────────────────────────────────────────────┐ │ 秒杀架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 第一层:CDN 静态资源缓存 │ │ │ │ │ ▼ │ │ 第二层:Nginx 动静分离 + 限流 │ │ │ │ │ ▼ │ │ 第三层:网关层 认证 + 限流 │ │ │ │ │ ▼ │ │ 第四层:应用层 Redis 预减库存 + MQ 异步下单 │ │ │ │ │ ▼ │ │ 第五层:数据层 MySQL 持久化 │ │ │ └─────────────────────────────────────────────────────────────┘

2.2 流量削峰

流量削峰策略: 1. 验证码:拉长请求时间 2. 答题:增加操作成本 3. 排队:请求队列化 4. 限流:丢弃多余请求

三、核心实现

3.1 库存预热

// 秒杀开始前预热库存到 Redis@ServicepublicclassSeckillPreheatService{@AutowiredprivateStringRedisTemplateredisTemplate;publicvoidpreheat(LongseckillId,Integerstock){StringstockKey="seckill:stock:"+seckillId;StringusersKey="seckill:users:"+seckillId;// 设置库存redisTemplate.opsForValue().set(stockKey,String.valueOf(stock));// 清空已购买用户redisTemplate.delete(usersKey);}}

3.2 秒杀核心逻辑

@ServicepublicclassSeckillService{@AutowiredprivateStringRedisTemplateredisTemplate;@AutowiredprivateRabbitTemplaterabbitTemplate;publicResultdoSeckill(LonguserId,LongseckillId){// 1. 检查是否重复购买StringusersKey="seckill:users:"+seckillId;BooleanisMember=redisTemplate.opsForSet().isMember(usersKey,userId);if(Boolean.TRUE.equals(isMember)){returnResult.fail("不能重复购买");}// 2. 预减库存(Lua 脚本保证原子性)StringstockKey="seckill:stock:"+seckillId;Stringscript="if tonumber(redis.call('GET', KEYS[1])) > 0 then "+" redis.call('DECR', KEYS[1]) "+" return 1 "+"else "+" return 0 "+"end";Longresult=redisTemplate.execute(newDefaultRedisScript<>(script,Long.class),Collections.singletonList(stockKey));if(result==null||result==0){returnResult.fail("库存不足");}// 3. 记录购买用户redisTemplate.opsForSet().add(usersKey,userId);// 4. 异步创建订单SeckillMessagemessage=newSeckillMessage(userId,seckillId);rabbitTemplate.convertAndSend("seckill.queue",message);returnResult.success("排队中,请稍后查询结果");}}

3.3 异步下单

@ComponentpublicclassSeckillConsumer{@RabbitListener(queues="seckill.queue")publicvoidhandleSeckill(SeckillMessagemessage){try{// 创建订单orderService.createSeckillOrder(message.getUserId(),message.getSeckillId());}catch(Exceptione){log.error("秒杀订单创建失败",e);// 回滚库存stockService.rollback(message.getSeckillId());}}}

四、防刷策略

4.1 验证码

// 验证码校验publicbooleanverifyCaptcha(StringcaptchaKey,Stringcaptcha){StringstoredCaptcha=redisTemplate.opsForValue().get(captchaKey);if(StringUtils.isEmpty(storedCaptcha)){returnfalse;}returnstoredCaptcha.equalsIgnoreCase(captcha);}

4.2 限流

// 用户级限流publicbooleancheckUserLimit(LonguserId){Stringkey="seckill:limit:user:"+userId;Longcount=redisTemplate.opsForValue().increment(key);if(count==1){redisTemplate.expire(key,1,TimeUnit.SECONDS);}returncount<=5;// 每秒最多5次}// IP 级限流publicbooleancheckIpLimit(Stringip){Stringkey="seckill:limit:ip:"+ip;Longcount=redisTemplate.opsForValue().increment(key);if(count==1){redisTemplate.expire(key,1,TimeUnit.SECONDS);}returncount<=10;// 每秒最多10次}

4.3 黑名单

// 黑名单检查publicbooleanisBlacklisted(LonguserId){returnredisTemplate.opsForSet().isMember("seckill:blacklist",userId);}

总结

秒杀系统特点:高并发、库存有限、时间限制
架构设计:分层架构、流量削峰
核心实现:库存预热、预减库存、异步下单
防刷策略:验证码、限流、黑名单

下篇预告:支付系统架构设计


作者:刘~浪地球
系列:技术选型与实战(三)
更新时间:2026-04-24

http://www.jsqmd.com/news/694541/

相关文章:

  • 在Windows上直接安装Android应用:告别模拟器的终极解决方案
  • 2026最新缅甸天然翡翠厂家/厂商推荐!国内优质权威榜单发布,广东佛山等地实力厂商口碑出众 - 十大品牌榜
  • Python自动化办公新利器:用undetected_chromedriver搞定那些需要登录的网站
  • python anext
  • Django React Boilerplate企业级最佳实践:Vinta Software经验总结
  • 2026最新中高端翡翠手镯供应商/批发推荐!广东佛山优质靠谱榜单发布,源头直供货真价实选品无忧 - 十大品牌榜
  • 2026 广东最新茶饮培训推荐!广州优质企业榜单发布,靠谱 - 十大品牌榜
  • 三步实现B站缓存视频永久保存:m4s转MP4完整解决方案
  • Flask》》 Flask-OpenID 认证、 OpenID Connect (OIDC)
  • 告别OpenHardwareMonitor:用C#的WMI手撸一个轻量级硬件监控工具(附完整源码)
  • Midscene.js完整教程:让AI成为你的浏览器操作员
  • 告别手动拖拽!用Qt的QHBoxLayout轻松搞定复杂工具栏布局(附完整代码)
  • 告别‘打包即膨胀’:用Python虚拟环境为你的Tkinter程序‘瘦身’,exe文件从95MB瘦到16MB
  • 国内2026 广东最新奶茶供应链推荐!广州优质公司榜单发布,靠谱 - 十大品牌榜
  • 2026年论文降AI后AI率又反弹?3款降AI工具的这个细节很多人忽视
  • 2026最新翡翠手镯定制批发/工厂推荐!广东优质权威榜单发布,实力靠谱佛山等地工厂精选 - 十大品牌榜
  • 【Eclipse】中文语言包离线安装
  • 超越ResNet:为什么HRNet的多分辨率并行结构在姿态估计和分割任务上更胜一筹?
  • Dynamic 3D Gaussians:革命性动态3D场景建模与跟踪技术详解
  • Genetic Drawing实战案例:从零开始制作个人专属艺术画作
  • 2026 广东珠三角最新燕窝推荐!广州优质厂家榜单发布,靠谱 - 十大品牌榜
  • 别再只盯着Linux了!从零到一,聊聊一个普通运维工程师的日常工具箱(含具体工具清单)
  • HackGen字体构建揭秘:从源代码到TTF的完整流程
  • ADSP21489的SPORT接口实战:手把手教你用CCES配置I2S音频传输(附SRU路由避坑点)
  • 如何快速激活Windows和Office?KMS_VL_ALL_AIO智能激活脚本完整指南
  • Linux 的 sleep 命令
  • 量子纠错码与Steane编码原理及实践
  • ConfettiSwiftUI源码解析:揭秘纯SwiftUI实现的动画引擎原理
  • Linux运维天花板!RHCA到底有多难?考下来直接封神
  • 实战对比:用Mellanox网卡和InfiniBand给Redis加速,UC、RC模式到底怎么选?