秒杀系统架构设计
系列导读本篇将深入讲解秒杀系统的架构设计与核心实现。文章目录目录一、秒杀系统特点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 库存预热// 秒杀开始前预热库存到 RedisServicepublicclassSeckillPreheatService{AutowiredprivateStringRedisTemplateredisTemplate;publicvoidpreheat(LongseckillId,Integerstock){StringstockKeyseckill:stock:seckillId;StringusersKeyseckill:users:seckillId;// 设置库存redisTemplate.opsForValue().set(stockKey,String.valueOf(stock));// 清空已购买用户redisTemplate.delete(usersKey);}}3.2 秒杀核心逻辑ServicepublicclassSeckillService{AutowiredprivateStringRedisTemplateredisTemplate;AutowiredprivateRabbitTemplaterabbitTemplate;publicResultdoSeckill(LonguserId,LongseckillId){// 1. 检查是否重复购买StringusersKeyseckill:users:seckillId;BooleanisMemberredisTemplate.opsForSet().isMember(usersKey,userId);if(Boolean.TRUE.equals(isMember)){returnResult.fail(不能重复购买);}// 2. 预减库存Lua 脚本保证原子性StringstockKeyseckill:stock:seckillId;Stringscriptif tonumber(redis.call(GET, KEYS[1])) 0 then redis.call(DECR, KEYS[1]) return 1 else return 0 end;LongresultredisTemplate.execute(newDefaultRedisScript(script,Long.class),Collections.singletonList(stockKey));if(resultnull||result0){returnResult.fail(库存不足);}// 3. 记录购买用户redisTemplate.opsForSet().add(usersKey,userId);// 4. 异步创建订单SeckillMessagemessagenewSeckillMessage(userId,seckillId);rabbitTemplate.convertAndSend(seckill.queue,message);returnResult.success(排队中请稍后查询结果);}}3.3 异步下单ComponentpublicclassSeckillConsumer{RabbitListener(queuesseckill.queue)publicvoidhandleSeckill(SeckillMessagemessage){try{// 创建订单orderService.createSeckillOrder(message.getUserId(),message.getSeckillId());}catch(Exceptione){log.error(秒杀订单创建失败,e);// 回滚库存stockService.rollback(message.getSeckillId());}}}四、防刷策略4.1 验证码// 验证码校验publicbooleanverifyCaptcha(StringcaptchaKey,Stringcaptcha){StringstoredCaptcharedisTemplate.opsForValue().get(captchaKey);if(StringUtils.isEmpty(storedCaptcha)){returnfalse;}returnstoredCaptcha.equalsIgnoreCase(captcha);}4.2 限流// 用户级限流publicbooleancheckUserLimit(LonguserId){Stringkeyseckill:limit:user:userId;LongcountredisTemplate.opsForValue().increment(key);if(count1){redisTemplate.expire(key,1,TimeUnit.SECONDS);}returncount5;// 每秒最多5次}// IP 级限流publicbooleancheckIpLimit(Stringip){Stringkeyseckill:limit:ip:ip;LongcountredisTemplate.opsForValue().increment(key);if(count1){redisTemplate.expire(key,1,TimeUnit.SECONDS);}returncount10;// 每秒最多10次}4.3 黑名单// 黑名单检查publicbooleanisBlacklisted(LonguserId){returnredisTemplate.opsForSet().isMember(seckill:blacklist,userId);}总结✅秒杀系统特点高并发、库存有限、时间限制✅架构设计分层架构、流量削峰✅核心实现库存预热、预减库存、异步下单✅防刷策略验证码、限流、黑名单下篇预告支付系统架构设计作者刘~浪地球系列技术选型与实战三更新时间2026-04-24