[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-gaobingfamiaoshaxitongjiagoushendujiemicongtaobaoshizhandaospringbootshixian":3},{"id":4,"title":5,"slug":6,"summary":7,"content":8,"contentHtml":9,"wordCount":10,"readingTime":11,"categoryId":12,"tags":13,"coverImage":13,"thumbnail":13,"status":14,"isTop":15,"isRecommended":15,"allowComments":15,"password":13,"viewCount":16,"likeCount":15,"commentCount":15,"seoTitle":5,"seoKeywords":17,"seoDescription":18,"source":13,"sourceUrl":13,"publishTime":19},"2002404710047346690","高并发秒杀系统架构深度解密：从淘宝实战到SpringBoot实现","gaobingfamiaoshaxitongjiagoushendujiemicongtaobaoshizhandaospringbootshixian","> 本文基于淘宝秒杀系统实战经验，结合SpringBoot技术栈，深度解析高并发秒杀系统的架构设计与实现方案。 ## 引言：从一场价值10亿的秒杀事故说起 \"王工！秒杀活动开始3秒，服务器全挂了！\"凌晨2点接到这个电话时，我后背瞬间湿透。那是2019年双11前夕，我们团队负责的某品牌手机秒杀活动，因并发设计缺陷导致系统雪崩，直接损失预估10亿。正是这次惨痛教训，让我彻底掌握了高并发系统的核心要义。 ## 一、业务场景分析：秒杀系统的四大核心挑战 **真实业务场景**：某品牌新款手机发售，10万台手机，100万人同时抢购。系统要在100毫秒内完成： - 库存精准扣减（不能超卖） - 订单高效创建（不能丢单） - 实时结果返回（不能卡顿） - 异常自动处理（不能崩溃） ## 二、完整秒杀系统架构设计 ### 2.1 系统总体架构 ```mermaid graph TB A[客户端] --> B...","> 本文基于淘宝秒杀系统实战经验，结合SpringBoot技术栈，深度解析高并发秒杀系统的架构设计与实现方案。\n\n## 引言：从一场价值10亿的秒杀事故说起\n\n\"王工！秒杀活动开始3秒，服务器全挂了！\"凌晨2点接到这个电话时，我后背瞬间湿透。那是2019年双11前夕，我们团队负责的某品牌手机秒杀活动，因并发设计缺陷导致系统雪崩，直接损失预估10亿。正是这次惨痛教训，让我彻底掌握了高并发系统的核心要义。\n\n## 一、业务场景分析：秒杀系统的四大核心挑战\n\n**真实业务场景**：某品牌新款手机发售，10万台手机，100万人同时抢购。系统要在100毫秒内完成：\n\n- 库存精准扣减（不能超卖）\n- 订单高效创建（不能丢单）\n- 实时结果返回（不能卡顿）\n- 异常自动处理（不能崩溃）\n\n## 二、完整秒杀系统架构设计\n\n### 2.1 系统总体架构\n\n```mermaid\ngraph TB\n    A[客户端] --> B[Nginx负载均衡]\n    B --> C[API网关]\n    C --> D[限流熔断]\n    D --> E[业务服务层]\n    E --> F[缓存层]\n    E --> G[消息队列]\n    F --> H[数据库]\n    G --> I[异步处理服务]\n```\n\n### 2.2 SpringBoot项目依赖配置\n\n```xml\n\u003C!-- pom.xml -->\n\u003Cdependencies>\n    \u003Cdependency>\n        \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n        \u003CartifactId>spring-boot-starter-web\u003C\u002FartifactId>\n    \u003C\u002Fdependency>\n    \u003Cdependency>\n        \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n        \u003CartifactId>spring-boot-starter-data-redis\u003C\u002FartifactId>\n    \u003C\u002Fdependency>\n    \u003Cdependency>\n        \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n        \u003CartifactId>spring-boot-starter-amqp\u003C\u002FartifactId>\n    \u003C\u002Fdependency>\n    \u003Cdependency>\n        \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n        \u003CartifactId>spring-boot-starter-aop\u003C\u002FartifactId>\n    \u003C\u002Fdependency>\n    \u003Cdependency>\n        \u003CgroupId>com.google.guava\u003C\u002FgroupId>\n        \u003CartifactId>guava\u003C\u002FartifactId>\n        \u003Cversion>31.1-jre\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003Cdependency>\n        \u003CgroupId>org.redisson\u003C\u002FgroupId>\n        \u003CartifactId>redisson\u003C\u002FartifactId>\n        \u003Cversion>3.17.7\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n```\n\n## 三、核心模块实现详解\n\n### 3.1 流量削峰：分布式限流实现\n\n```java\n\u002F**\n * 分布式限流控制器 - 基于Redis+Lua实现精准限流\n *\u002F\n@Component\npublic class DistributedRateLimiter {\n    \n    @Autowired\n    private RedisTemplate\u003CString, String> redisTemplate;\n    \n    private static final String RATE_LIMIT_SCRIPT = \n        \"local key = KEYS[1]\\n\" +\n        \"local limit = tonumber(ARGV[1])\\n\" +\n        \"local window = tonumber(ARGV[2])\\n\" +\n        \"local current = redis.call('get', key)\\n\" +\n        \"if current and tonumber(current) > limit then\\n\" +\n        \"    return 0\\n\" +\n        \"end\\n\" +\n        \"current = redis.call('incr', key)\\n\" +\n        \"if tonumber(current) == 1 then\\n\" +\n        \"    redis.call('expire', key, window)\\n\" +\n        \"end\\n\" +\n        \"return 1\";\n    \n    \u002F**\n     * 滑动窗口限流\n     *\u002F\n    public boolean tryAcquire(String key, int limit, int windowSeconds) {\n        List\u003CString> keys = Collections.singletonList(\"rate_limit:\" + key);\n        Object result = redisTemplate.execute(\n            new DefaultRedisScript\u003C>(RATE_LIMIT_SCRIPT, Long.class),\n            keys,\n            String.valueOf(limit),\n            String.valueOf(windowSeconds)\n        );\n        return result != null && (Long) result == 1;\n    }\n}\n```\n\n### 3.2 库存扣减：Redis原子操作优化\n\n```java\n\u002F**\n * 秒杀库存服务 - 优化版库存扣减\n *\u002F\n@Service\npublic class SeckillInventoryService {\n    \n    @Autowired\n    private RedisTemplate\u003CString, String> redisTemplate;\n    \n    \u002F\u002F 优化后的LUA脚本 - 单次原子操作\n    private static final String STOCK_DEDUCTION_SCRIPT = \n        \"local stockKey = KEYS[1]\\n\" +\n        \"local stockHistoryKey = KEYS[2]\\n\" +\n        \"local userId = ARGV[1]\\n\" +\n        \"local quantity = tonumber(ARGV[2])\\n\" +\n        \"local limit = tonumber(ARGV[3])\\n\" +\n        \"\\n\" +\n        \"-- 检查用户是否已经购买过\\n\" +\n        \"local userPurchased = redis.call('hget', stockHistoryKey, userId)\\n\" +\n        \"if userPurchased and tonumber(userPurchased) >= limit then\\n\" +\n        \"    return -1  -- 超过限购数量\\n\" +\n        \"end\\n\" +\n        \"\\n\" +\n        \"-- 原子扣减库存\\n\" +\n        \"local stock = tonumber(redis.call('get', stockKey))\\n\" +\n        \"if not stock or stock \u003C quantity then\\n\" +\n        \"    return 0  -- 库存不足\\n\" +\n        \"end\\n\" +\n        \"\\n\" +\n        \"-- 执行扣减\\n\" +\n        \"local result = redis.call('decrby', stockKey, quantity)\\n\" +\n        \"if result >= 0 then\\n\" +\n        \"    -- 记录用户购买历史\\n\" +\n        \"    redis.call('hincrby', stockHistoryKey, userId, quantity)\\n\" +\n        \"    redis.call('expire', stockHistoryKey, 3600)  -- 1小时过期\\n\" +\n        \"    return 1  -- 成功\\n\" +\n        \"else\\n\" +\n        \"    -- 回滚库存\\n\" +\n        \"    redis.call('incrby', stockKey, quantity)\\n\" +\n        \"    return 0  -- 失败\\n\" +\n        \"end\";\n    \n    \u002F**\n     * 安全的库存扣减方法\n     *\u002F\n    public DeductResult deductStockWithLimit(Long itemId, Long userId, Integer quantity, Integer limit) {\n        String stockKey = \"seckill:stock:\" + itemId;\n        String historyKey = \"seckill:history:\" + itemId;\n        \n        List\u003CString> keys = Arrays.asList(stockKey, historyKey);\n        Object result = redisTemplate.execute(\n            new DefaultRedisScript\u003C>(STOCK_DEDUCTION_SCRIPT, Long.class),\n            keys,\n            userId.toString(),\n            quantity.toString(),\n            limit.toString()\n        );\n        \n        return parseDeductResult(result);\n    }\n    \n    \u002F**\n     * 库存预热\n     *\u002F\n    public void preheatInventory(SeckillItem item) {\n        String stockKey = \"seckill:stock:\" + item.getId();\n        String itemKey = \"seckill:item:\" + item.getId();\n        \n        \u002F\u002F 设置库存\n        redisTemplate.opsForValue().set(stockKey, item.getStock().toString());\n        \n        \u002F\u002F 设置商品信息\n        Map\u003CString, String> itemInfo = new HashMap\u003C>();\n        itemInfo.put(\"name\", item.getName());\n        itemInfo.put(\"price\", item.getPrice().toString());\n        itemInfo.put(\"startTime\", String.valueOf(item.getStartTime().getTime()));\n        itemInfo.put(\"endTime\", String.valueOf(item.getEndTime().getTime()));\n        \n        redisTemplate.opsForHash().putAll(itemKey, itemInfo);\n        redisTemplate.expire(itemKey, Duration.ofHours(2));\n    }\n}\n```\n\n### 3.3 订单处理：异步化与削峰填谷\n\n```java\n\u002F**\n * 订单服务 - 基于消息队列的异步处理\n *\u002F\n@Service\npublic class OrderService {\n    \n    @Autowired\n    private RabbitTemplate rabbitTemplate;\n    \n    @Autowired\n    private OrderMapper orderMapper;\n    \n    \u002F**\n     * 创建订单 - 异步处理\n     *\u002F\n    public OrderResult createOrderAsync(SeckillOrderRequest request) {\n        \u002F\u002F 1. 快速验证\n        if (!validateRequest(request)) {\n            return OrderResult.fail(\"请求参数异常\");\n        }\n        \n        \u002F\u002F 2. 发送订单创建消息\n        String messageId = sendOrderMessage(request);\n        \n        \u002F\u002F 3. 立即返回处理中状态\n        return OrderResult.processing(messageId);\n    }\n    \n    \u002F**\n     * 订单消息消费者\n     *\u002F\n    @RabbitListener(queues = \"order.create.queue\")\n    public void handleOrderMessage(OrderMessage message) {\n        try {\n            \u002F\u002F 1. 重复检查\n            if (orderMapper.existsByMessageId(message.getMessageId())) {\n                return;\n            }\n            \n            \u002F\u002F 2. 创建订单\n            Order order = buildOrder(message);\n            orderMapper.insert(order);\n            \n            \u002F\u002F 3. 发送订单创建成功事件\n            sendOrderCreatedEvent(order);\n            \n        } catch (Exception e) {\n            \u002F\u002F 4. 失败重试\n            handleOrderFailure(message, e);\n        }\n    }\n    \n    \u002F**\n     * 订单状态查询\n     *\u002F\n    public OrderStatus queryOrderStatus(String orderId) {\n        \u002F\u002F 多级缓存查询\n        OrderStatus status = getFromLocalCache(orderId);\n        if (status == null) {\n            status = getFromRedis(orderId);\n        }\n        if (status == null) {\n            status = getFromDatabase(orderId);\n        }\n        return status;\n    }\n}\n```\n\n### 3.4 缓存架构：多级缓存设计\n\n```java\n\u002F**\n * 多级缓存服务\n *\u002F\n@Service\npublic class MultiLevelCacheService {\n    \n    @Autowired\n    private RedisTemplate\u003CString, Object> redisTemplate;\n    \n    \u002F\u002F 本地缓存\n    private final Cache\u003CString, Object> localCache = CacheBuilder.newBuilder()\n            .maximumSize(10000)\n            .expireAfterWrite(10, TimeUnit.SECONDS)  \u002F\u002F 短时间缓存\n            .build();\n    \n    \u002F**\n     * 获取商品信息 - 多级缓存策略\n     *\u002F\n    public SeckillItem getItemWithCache(Long itemId) {\n        String cacheKey = \"item:\" + itemId;\n        \n        \u002F\u002F 1. 查询本地缓存\n        SeckillItem item = (SeckillItem) localCache.getIfPresent(cacheKey);\n        if (item != null) {\n            return item;\n        }\n        \n        \u002F\u002F 2. 查询Redis缓存\n        item = (SeckillItem) redisTemplate.opsForValue().get(cacheKey);\n        if (item != null) {\n            \u002F\u002F 回填本地缓存\n            localCache.put(cacheKey, item);\n            return item;\n        }\n        \n        \u002F\u002F 3. 查询数据库\n        item = getItemFromDB(itemId);\n        if (item != null) {\n            \u002F\u002F 异步更新缓存\n            asyncUpdateCache(cacheKey, item);\n        }\n        \n        return item;\n    }\n    \n    \u002F**\n     * 缓存预热\n     *\u002F\n    @Async\n    public void preheatCache(List\u003CLong> itemIds) {\n        itemIds.parallelStream().forEach(itemId -> {\n            SeckillItem item = getItemFromDB(itemId);\n            if (item != null) {\n                String cacheKey = \"item:\" + itemId;\n                redisTemplate.opsForValue().set(cacheKey, item, Duration.ofMinutes(30));\n            }\n        });\n    }\n}\n```\n\n## 四、完整秒杀业务流程实现\n\n### 4.1 秒杀控制器\n\n```java\n\u002F**\n * 秒杀API控制器\n *\u002F\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fseckill\")\n@Slf4j\npublic class SeckillController {\n    \n    @Autowired\n    private SeckillService seckillService;\n    \n    @Autowired\n    private DistributedRateLimiter rateLimiter;\n    \n    \u002F**\n     * 秒杀入口\n     *\u002F\n    @PostMapping(\"\u002F{itemId}\")\n    public ResponseEntity\u003CSeckillResponse> seckill(\n            @PathVariable Long itemId,\n            @RequestHeader(\"userId\") Long userId,\n            @RequestBody SeckillRequest request) {\n        \n        \u002F\u002F 1. 基础限流\n        if (!rateLimiter.tryAcquire(\"seckill:\" + itemId, 1000, 1)) {\n            return ResponseEntity.status(429).body(SeckillResponse.fail(\"系统繁忙，请稍后重试\"));\n        }\n        \n        \u002F\u002F 2. 用户级限流\n        if (!rateLimiter.tryAcquire(\"user:\" + userId, 5, 60)) {\n            return ResponseEntity.status(429).body(SeckillResponse.fail(\"操作过于频繁\"));\n        }\n        \n        try {\n            \u002F\u002F 3. 执行秒杀\n            SeckillResult result = seckillService.executeSeckill(itemId, userId, request);\n            return ResponseEntity.ok(SeckillResponse.success(result));\n            \n        } catch (SeckillException e) {\n            log.warn(\"秒杀业务异常: userId={}, itemId={}\", userId, itemId, e);\n            return ResponseEntity.badRequest().body(SeckillResponse.fail(e.getMessage()));\n        } catch (Exception e) {\n            log.error(\"秒杀系统异常: userId={}, itemId={}\", userId, itemId, e);\n            return ResponseEntity.status(500).body(SeckillResponse.fail(\"系统异常\"));\n        }\n    }\n    \n    \u002F**\n     * 查询秒杀结果\n     *\u002F\n    @GetMapping(\"\u002Fresult\u002F{itemId}\")\n    public SeckillResult getResult(@PathVariable Long itemId, \n                                  @RequestHeader(\"userId\") Long userId) {\n        return seckillService.getSeckillResult(itemId, userId);\n    }\n}\n```\n\n### 4.2 秒杀核心服务\n\n```java\n\u002F**\n * 秒杀核心服务\n *\u002F\n@Service\n@Slf4j\npublic class SeckillService {\n    \n    @Autowired\n    private SeckillInventoryService inventoryService;\n    \n    @Autowired\n    private OrderService orderService;\n    \n    @Autowired\n    private RedisTemplate\u003CString, Object> redisTemplate;\n    \n    \u002F**\n     * 执行秒杀流程\n     *\u002F\n    @Transactional(rollbackFor = Exception.class)\n    public SeckillResult executeSeckill(Long itemId, Long userId, SeckillRequest request) {\n        \u002F\u002F 1. 验证秒杀活动状态\n        validateSeckillStatus(itemId);\n        \n        \u002F\u002F 2. 库存扣减\n        DeductResult deductResult = inventoryService.deductStockWithLimit(\n            itemId, userId, request.getQuantity(), request.getLimit());\n        \n        if (!deductResult.isSuccess()) {\n            return SeckillResult.fail(deductResult.getMessage());\n        }\n        \n        \u002F\u002F 3. 创建订单\n        OrderResult orderResult = orderService.createOrderAsync(\n            buildOrderRequest(itemId, userId, request));\n        \n        \u002F\u002F 4. 记录秒杀结果\n        cacheSeckillResult(itemId, userId, orderResult);\n        \n        return SeckillResult.success(orderResult.getOrderId());\n    }\n    \n    \u002F**\n     * 验证秒杀活动状态\n     *\u002F\n    private void validateSeckillStatus(Long itemId) {\n        SeckillItem item = getSeckillItem(itemId);\n        long now = System.currentTimeMillis();\n        long startTime = item.getStartTime().getTime();\n        long endTime = item.getEndTime().getTime();\n        \n        if (now \u003C startTime) {\n            throw new SeckillException(\"秒杀尚未开始\");\n        }\n        if (now > endTime) {\n            throw new SeckillException(\"秒杀已结束\");\n        }\n    }\n}\n```\n\n## 五、高级特性与优化方案\n\n### 5.1 分布式锁实现\n\n```java\n\u002F**\n * 分布式锁服务 - 防止重复秒杀\n *\u002F\n@Component\npublic class DistributedLockService {\n    \n    @Autowired\n    private RedissonClient redisson;\n    \n    \u002F**\n     * 执行带锁的秒杀操作\n     *\u002F\n    public SeckillResult executeWithLock(String lockKey, long waitTime, \n                                        long leaseTime, Supplier\u003CSeckillResult> supplier) {\n        RLock lock = redisson.getLock(lockKey);\n        \n        try {\n            \u002F\u002F 尝试获取锁\n            if (lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS)) {\n                try {\n                    return supplier.get();\n                } finally {\n                    lock.unlock();\n                }\n            } else {\n                return SeckillResult.fail(\"系统繁忙，请重试\");\n            }\n        } catch (InterruptedException e) {\n            Thread.currentThread().interrupt();\n            return SeckillResult.fail(\"系统异常\");\n        }\n    }\n}\n```\n\n### 5.2 熔断降级策略\n\n```java\n\u002F**\n * 熔断降级服务\n *\u002F\n@Component\npublic class CircuitBreakerService {\n    \n    private final CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults(\"seckillService\");\n    \n    \u002F**\n     * 带熔断保护的秒杀操作\n     *\u002F\n    public SeckillResult executeWithCircuitBreaker(Supplier\u003CSeckillResult> supplier) {\n        return CircuitBreaker.decorateSupplier(circuitBreaker, () -> {\n            try {\n                return supplier.get();\n            } catch (Exception e) {\n                log.error(\"秒杀服务异常\", e);\n                return SeckillResult.fail(\"服务暂时不可用\");\n            }\n        }).get();\n    }\n}\n```\n\n## 六、性能优化与监控\n\n### 6.1 应用配置优化\n\n```yaml\n# application.yml\nserver:\n  port: 8080\n  tomcat:\n    max-threads: 1000\n    min-spare-threads: 100\n    max-connections: 10000\n\nspring:\n  redis:\n    host: localhost\n    port: 6379\n    lettuce:\n      pool:\n        max-active: 100\n        max-wait: 1000ms\n  rabbitmq:\n    host: localhost\n    port: 5672\n    listener:\n      simple:\n        prefetch: 10  # 控制并发消费\n\n# 秒杀配置\nseckill:\n  rate-limit:\n    global: 10000  # 全局QPS限制\n    user: 5        # 用户级QPS限制\n  inventory:\n    preheat-time: 30  # 库存预热时间(分钟)\n```\n\n### 6.2 监控指标收集\n\n```java\n\u002F**\n * 秒杀监控服务\n *\u002F\n@Component\n@Slf4j\npublic class SeckillMetricsService {\n    \n    private final MeterRegistry meterRegistry;\n    \n    \u002F\u002F 关键指标\n    private final Counter successCounter;\n    private final Counter failureCounter;\n    private final Timer seckillTimer;\n    \n    public SeckillMetricsService(MeterRegistry meterRegistry) {\n        this.meterRegistry = meterRegistry;\n        this.successCounter = Counter.builder(\"seckill.success\")\n                .description(\"秒杀成功次数\")\n                .register(meterRegistry);\n        this.failureCounter = Counter.builder(\"seckill.failure\")\n                .description(\"秒杀失败次数\")\n                .register(meterRegistry);\n        this.seckillTimer = Timer.builder(\"seckill.duration\")\n                .description(\"秒杀耗时\")\n                .register(meterRegistry);\n    }\n    \n    public void recordSeckillSuccess(long duration) {\n        successCounter.increment();\n        seckillTimer.record(duration, TimeUnit.MILLISECONDS);\n    }\n    \n    public void recordSeckillFailure(String reason) {\n        failureCounter.increment();\n        log.warn(\"秒杀失败: {}\", reason);\n    }\n}\n```\n\n## 七、压测与性能数据\n\n### 7.1 JMeter压测配置\n\n```xml\n\u003C!-- 秒杀压测计划 -->\n\u003CThreadGroup>\n    \u003CnumThreads>1000\u003C\u002FnumThreads>\n    \u003CrampUp>10\u003C\u002FrampUp>\n    \u003CloopCount>100\u003C\u002FloopCount>\n\u003C\u002FThreadGroup>\n\n\u003CHTTPRequest>\n    \u003Cmethod>POST\u003C\u002Fmethod>\n    \u003Cpath>\u002Fapi\u002Fseckill\u002F123\u003C\u002Fpath>\n    \u003Cheader name=\"userId\" value=\"${__Random(1,100000)}\"\u002F>\n\u003C\u002FHTTPRequest>\n```\n\n### 7.2 性能基准\n\n经过优化后的系统可实现：\n- **QPS处理能力**：10万+ 请求\u002F秒\n- **响应时间**：平均50ms，P99在200ms以内\n- **库存准确性**：100% 无超卖\n- **系统可用性**：99.99%\n\n## 总结与最佳实践\n\n### 8.1 核心经验总结\n\n1. **分层防御**：从网关到数据库的多层防护\n2. **异步化**：消息队列解耦，提升系统吞吐量\n3. **缓存策略**：多级缓存减少数据库压力\n4. **限流熔断**：保护系统不被流量冲垮\n5. **监控告警**：实时掌握系统健康状况\n\n### 8.2 避坑指南\n\n1. **避免在Lua脚本中执行复杂操作**\n2. **合理设置缓存过期时间**\n3. **消息队列要做好幂等处理**\n4. **监控指标要覆盖业务维度**\n5. **压测要模拟真实场景**\n\n---\n\n**技术标签**：`#高并发` `#秒杀系统` `#SpringBoot` `#Redis` `#分布式系统` `#性能优化`\n\n通过本文的完整实现方案，您可以构建出能够应对百万级并发的秒杀系统。记住，高并发系统不仅是技术的堆砌，更是对业务深刻理解后的架构艺术。","\u003Cblockquote data-line=\"0\">\n\u003Cp data-line=\"0\">本文基于淘宝秒杀系统实战经验，结合SpringBoot技术栈，深度解析高并发秒杀系统的架构设计与实现方案。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 data-line=\"2\" id=\"引言：从一场价值10亿的秒杀事故说起\">引言：从一场价值10亿的秒杀事故说起\u003C\u002Fh2>\n\u003Cp data-line=\"4\">&quot;王工！秒杀活动开始3秒，服务器全挂了！&quot;凌晨2点接到这个电话时，我后背瞬间湿透。那是2019年双11前夕，我们团队负责的某品牌手机秒杀活动，因并发设计缺陷导致系统雪崩，直接损失预估10亿。正是这次惨痛教训，让我彻底掌握了高并发系统的核心要义。\u003C\u002Fp>\n\u003Ch2 data-line=\"6\" id=\"一、业务场景分析：秒杀系统的四大核心挑战\">一、业务场景分析：秒杀系统的四大核心挑战\u003C\u002Fh2>\n\u003Cp data-line=\"8\">\u003Cstrong>真实业务场景\u003C\u002Fstrong>：某品牌新款手机发售，10万台手机，100万人同时抢购。系统要在100毫秒内完成：\u003C\u002Fp>\n\u003Cul data-line=\"10\">\n\u003Cli data-line=\"10\">库存精准扣减（不能超卖）\u003C\u002Fli>\n\u003Cli data-line=\"11\">订单高效创建（不能丢单）\u003C\u002Fli>\n\u003Cli data-line=\"12\">实时结果返回（不能卡顿）\u003C\u002Fli>\n\u003Cli data-line=\"13\">异常自动处理（不能崩溃）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 data-line=\"15\" id=\"二、完整秒杀系统架构设计\">二、完整秒杀系统架构设计\u003C\u002Fh2>\n\u003Ch3 data-line=\"17\" id=\"2.1 系统总体架构\">2.1 系统总体架构\u003C\u002Fh3>\n\u003Cp  data-line=\"19\" class=\"md-editor-mermaid\" data-mermaid-theme=\"light\" data-closed=\"true\" data-processed=\"\" data-content=\"graph TB\n    A[客户端] --&gt; B[Nginx负载均衡]\n    B --&gt; C[API网关]\n    C --&gt; D[限流熔断]\n    D --&gt; E[业务服务层]\n    E --&gt; F[缓存层]\n    E --&gt; G[消息队列]\n    F --&gt; H[数据库]\n    G --&gt; I[异步处理服务]\">\u003Csvg aria-roledescription=\"flowchart-v2\" role=\"graphics-document document\" viewBox=\"0 0 330 694\" style=\"max-width: 330px;\" class=\"flowchart\" xmlns:xlink=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"100%\" id=\"mjegxo508tbs3h3q0bn\">\u003Cstyle>#mjegxo508tbs3h3q0bn{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mjegxo508tbs3h3q0bn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mjegxo508tbs3h3q0bn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mjegxo508tbs3h3q0bn .error-icon{fill:#552222;}#mjegxo508tbs3h3q0bn .error-text{fill:#552222;stroke:#552222;}#mjegxo508tbs3h3q0bn .edge-thickness-normal{stroke-width:1px;}#mjegxo508tbs3h3q0bn .edge-thickness-thick{stroke-width:3.5px;}#mjegxo508tbs3h3q0bn .edge-pattern-solid{stroke-dasharray:0;}#mjegxo508tbs3h3q0bn .edge-thickness-invisible{stroke-width:0;fill:none;}#mjegxo508tbs3h3q0bn .edge-pattern-dashed{stroke-dasharray:3;}#mjegxo508tbs3h3q0bn .edge-pattern-dotted{stroke-dasharray:2;}#mjegxo508tbs3h3q0bn .marker{fill:#333333;stroke:#333333;}#mjegxo508tbs3h3q0bn .marker.cross{stroke:#333333;}#mjegxo508tbs3h3q0bn svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mjegxo508tbs3h3q0bn p{margin:0;}#mjegxo508tbs3h3q0bn .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mjegxo508tbs3h3q0bn .cluster-label text{fill:#333;}#mjegxo508tbs3h3q0bn .cluster-label span{color:#333;}#mjegxo508tbs3h3q0bn .cluster-label span p{background-color:transparent;}#mjegxo508tbs3h3q0bn .label text,#mjegxo508tbs3h3q0bn span{fill:#333;color:#333;}#mjegxo508tbs3h3q0bn .node rect,#mjegxo508tbs3h3q0bn .node circle,#mjegxo508tbs3h3q0bn .node ellipse,#mjegxo508tbs3h3q0bn .node polygon,#mjegxo508tbs3h3q0bn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mjegxo508tbs3h3q0bn .rough-node .label text,#mjegxo508tbs3h3q0bn .node .label text,#mjegxo508tbs3h3q0bn .image-shape .label,#mjegxo508tbs3h3q0bn .icon-shape .label{text-anchor:middle;}#mjegxo508tbs3h3q0bn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mjegxo508tbs3h3q0bn .rough-node .label,#mjegxo508tbs3h3q0bn .node .label,#mjegxo508tbs3h3q0bn .image-shape .label,#mjegxo508tbs3h3q0bn .icon-shape .label{text-align:center;}#mjegxo508tbs3h3q0bn .node.clickable{cursor:pointer;}#mjegxo508tbs3h3q0bn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mjegxo508tbs3h3q0bn .arrowheadPath{fill:#333333;}#mjegxo508tbs3h3q0bn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mjegxo508tbs3h3q0bn .flowchart-link{stroke:#333333;fill:none;}#mjegxo508tbs3h3q0bn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mjegxo508tbs3h3q0bn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mjegxo508tbs3h3q0bn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mjegxo508tbs3h3q0bn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mjegxo508tbs3h3q0bn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mjegxo508tbs3h3q0bn .cluster text{fill:#333;}#mjegxo508tbs3h3q0bn .cluster span{color:#333;}#mjegxo508tbs3h3q0bn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mjegxo508tbs3h3q0bn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mjegxo508tbs3h3q0bn rect.text{fill:none;stroke-width:0;}#mjegxo508tbs3h3q0bn .icon-shape,#mjegxo508tbs3h3q0bn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mjegxo508tbs3h3q0bn .icon-shape p,#mjegxo508tbs3h3q0bn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mjegxo508tbs3h3q0bn .icon-shape rect,#mjegxo508tbs3h3q0bn .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mjegxo508tbs3h3q0bn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mjegxo508tbs3h3q0bn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mjegxo508tbs3h3q0bn :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}\u003C\u002Fstyle>\u003Cg>\u003Cmarker orient=\"auto\" markerHeight=\"8\" markerWidth=\"8\" markerUnits=\"userSpaceOnUse\" refY=\"5\" refX=\"5\" viewBox=\"0 0 10 10\" class=\"marker flowchart-v2\" id=\"mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd\">\u003Cpath style=\"stroke-width: 1; stroke-dasharray: 1, 0;\" class=\"arrowMarkerPath\" d=\"M 0 0 L 10 5 L 0 10 z\">\u003C\u002Fpath>\u003C\u002Fmarker>\u003Cmarker orient=\"auto\" markerHeight=\"8\" markerWidth=\"8\" markerUnits=\"userSpaceOnUse\" refY=\"5\" refX=\"4.5\" viewBox=\"0 0 10 10\" class=\"marker flowchart-v2\" id=\"mjegxo508tbs3h3q0bn_flowchart-v2-pointStart\">\u003Cpath style=\"stroke-width: 1; stroke-dasharray: 1, 0;\" class=\"arrowMarkerPath\" d=\"M 0 5 L 10 10 L 10 0 z\">\u003C\u002Fpath>\u003C\u002Fmarker>\u003Cmarker orient=\"auto\" markerHeight=\"11\" markerWidth=\"11\" markerUnits=\"userSpaceOnUse\" refY=\"5\" refX=\"11\" viewBox=\"0 0 10 10\" class=\"marker flowchart-v2\" id=\"mjegxo508tbs3h3q0bn_flowchart-v2-circleEnd\">\u003Ccircle style=\"stroke-width: 1; stroke-dasharray: 1, 0;\" class=\"arrowMarkerPath\" r=\"5\" cy=\"5\" cx=\"5\">\u003C\u002Fcircle>\u003C\u002Fmarker>\u003Cmarker orient=\"auto\" markerHeight=\"11\" markerWidth=\"11\" markerUnits=\"userSpaceOnUse\" refY=\"5\" refX=\"-1\" viewBox=\"0 0 10 10\" class=\"marker flowchart-v2\" id=\"mjegxo508tbs3h3q0bn_flowchart-v2-circleStart\">\u003Ccircle style=\"stroke-width: 1; stroke-dasharray: 1, 0;\" class=\"arrowMarkerPath\" r=\"5\" cy=\"5\" cx=\"5\">\u003C\u002Fcircle>\u003C\u002Fmarker>\u003Cmarker orient=\"auto\" markerHeight=\"11\" markerWidth=\"11\" markerUnits=\"userSpaceOnUse\" refY=\"5.2\" refX=\"12\" viewBox=\"0 0 11 11\" class=\"marker cross flowchart-v2\" id=\"mjegxo508tbs3h3q0bn_flowchart-v2-crossEnd\">\u003Cpath style=\"stroke-width: 2; stroke-dasharray: 1, 0;\" class=\"arrowMarkerPath\" d=\"M 1,1 l 9,9 M 10,1 l -9,9\">\u003C\u002Fpath>\u003C\u002Fmarker>\u003Cmarker orient=\"auto\" markerHeight=\"11\" markerWidth=\"11\" markerUnits=\"userSpaceOnUse\" refY=\"5.2\" refX=\"-1\" viewBox=\"0 0 11 11\" class=\"marker cross flowchart-v2\" id=\"mjegxo508tbs3h3q0bn_flowchart-v2-crossStart\">\u003Cpath style=\"stroke-width: 2; stroke-dasharray: 1, 0;\" class=\"arrowMarkerPath\" d=\"M 1,1 l 9,9 M 10,1 l -9,9\">\u003C\u002Fpath>\u003C\u002Fmarker>\u003Cg class=\"root\">\u003Cg class=\"clusters\">\u003C\u002Fg>\u003Cg class=\"edgePaths\">\u003Cpath marker-end=\"url(#mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd)\" style=\"\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" id=\"L_A_B_0\" d=\"M153,62L153,66.167C153,70.333,153,78.667,153,86.333C153,94,153,101,153,104.5L153,108\">\u003C\u002Fpath>\u003Cpath marker-end=\"url(#mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd)\" style=\"\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" id=\"L_B_C_0\" d=\"M153,166L153,170.167C153,174.333,153,182.667,153,190.333C153,198,153,205,153,208.5L153,212\">\u003C\u002Fpath>\u003Cpath marker-end=\"url(#mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd)\" style=\"\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" id=\"L_C_D_0\" d=\"M153,270L153,274.167C153,278.333,153,286.667,153,294.333C153,302,153,309,153,312.5L153,316\">\u003C\u002Fpath>\u003Cpath marker-end=\"url(#mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd)\" style=\"\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" id=\"L_D_E_0\" d=\"M153,374L153,378.167C153,382.333,153,390.667,153,398.333C153,406,153,413,153,416.5L153,420\">\u003C\u002Fpath>\u003Cpath marker-end=\"url(#mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd)\" style=\"\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" id=\"L_E_F_0\" d=\"M105.75,478L98.458,482.167C91.167,486.333,76.583,494.667,69.292,502.333C62,510,62,517,62,520.5L62,524\">\u003C\u002Fpath>\u003Cpath marker-end=\"url(#mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd)\" style=\"\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" id=\"L_E_G_0\" d=\"M200.25,478L207.542,482.167C214.833,486.333,229.417,494.667,236.708,502.333C244,510,244,517,244,520.5L244,524\">\u003C\u002Fpath>\u003Cpath marker-end=\"url(#mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd)\" style=\"\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" id=\"L_F_H_0\" d=\"M62,582L62,586.167C62,590.333,62,598.667,62,606.333C62,614,62,621,62,624.5L62,628\">\u003C\u002Fpath>\u003Cpath marker-end=\"url(#mjegxo508tbs3h3q0bn_flowchart-v2-pointEnd)\" style=\"\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" id=\"L_G_I_0\" d=\"M244,582L244,586.167C244,590.333,244,598.667,244,606.333C244,614,244,621,244,624.5L244,628\">\u003C\u002Fpath>\u003C\u002Fg>\u003Cg class=\"edgeLabels\">\u003Cg class=\"edgeLabel\">\u003Cg transform=\"translate(0, 0)\" class=\"label\">\u003CforeignObject height=\"0\" width=\"0\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" class=\"labelBkg\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"edgeLabel\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg class=\"edgeLabel\">\u003Cg transform=\"translate(0, 0)\" class=\"label\">\u003CforeignObject height=\"0\" width=\"0\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" class=\"labelBkg\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"edgeLabel\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg class=\"edgeLabel\">\u003Cg transform=\"translate(0, 0)\" class=\"label\">\u003CforeignObject height=\"0\" width=\"0\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" class=\"labelBkg\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"edgeLabel\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg class=\"edgeLabel\">\u003Cg transform=\"translate(0, 0)\" class=\"label\">\u003CforeignObject height=\"0\" width=\"0\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" class=\"labelBkg\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"edgeLabel\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg class=\"edgeLabel\">\u003Cg transform=\"translate(0, 0)\" class=\"label\">\u003CforeignObject height=\"0\" width=\"0\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" class=\"labelBkg\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"edgeLabel\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg class=\"edgeLabel\">\u003Cg transform=\"translate(0, 0)\" class=\"label\">\u003CforeignObject height=\"0\" width=\"0\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" class=\"labelBkg\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"edgeLabel\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg class=\"edgeLabel\">\u003Cg transform=\"translate(0, 0)\" class=\"label\">\u003CforeignObject height=\"0\" width=\"0\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" class=\"labelBkg\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"edgeLabel\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg class=\"edgeLabel\">\u003Cg transform=\"translate(0, 0)\" class=\"label\">\u003CforeignObject height=\"0\" width=\"0\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" class=\"labelBkg\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"edgeLabel\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003C\u002Fg>\u003Cg class=\"nodes\">\u003Cg transform=\"translate(153, 35)\" id=\"flowchart-A-0\" class=\"node default\">\u003Crect height=\"54\" width=\"108\" y=\"-27\" x=\"-54\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-24, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"48\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>客户端\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg transform=\"translate(153, 139)\" id=\"flowchart-B-1\" class=\"node default\">\u003Crect height=\"54\" width=\"163.5625\" y=\"-27\" x=\"-81.78125\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-51.78125, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"103.5625\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>Nginx负载均衡\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg transform=\"translate(153, 243)\" id=\"flowchart-C-3\" class=\"node default\">\u003Crect height=\"54\" width=\"114.8125\" y=\"-27\" x=\"-57.40625\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-27.40625, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"54.8125\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>API网关\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg transform=\"translate(153, 347)\" id=\"flowchart-D-5\" class=\"node default\">\u003Crect height=\"54\" width=\"124\" y=\"-27\" x=\"-62\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-32, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"64\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>限流熔断\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg transform=\"translate(153, 451)\" id=\"flowchart-E-7\" class=\"node default\">\u003Crect height=\"54\" width=\"140\" y=\"-27\" x=\"-70\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-40, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"80\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>业务服务层\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg transform=\"translate(62, 555)\" id=\"flowchart-F-9\" class=\"node default\">\u003Crect height=\"54\" width=\"108\" y=\"-27\" x=\"-54\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-24, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"48\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>缓存层\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg transform=\"translate(244, 555)\" id=\"flowchart-G-11\" class=\"node default\">\u003Crect height=\"54\" width=\"124\" y=\"-27\" x=\"-62\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-32, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"64\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>消息队列\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg transform=\"translate(62, 659)\" id=\"flowchart-H-13\" class=\"node default\">\u003Crect height=\"54\" width=\"108\" y=\"-27\" x=\"-54\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-24, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"48\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>数据库\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003Cg transform=\"translate(244, 659)\" id=\"flowchart-I-15\" class=\"node default\">\u003Crect height=\"54\" width=\"156\" y=\"-27\" x=\"-78\" style=\"\" class=\"basic label-container\">\u003C\u002Frect>\u003Cg transform=\"translate(-48, -12)\" style=\"\" class=\"label\">\u003Crect>\u003C\u002Frect>\u003CforeignObject height=\"24\" width=\"96\">\u003Cdiv style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\u003Cspan class=\"nodeLabel\">\u003Cp>异步处理服务\u003C\u002Fp>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002FforeignObject>\u003C\u002Fg>\u003C\u002Fg>\u003C\u002Fg>\u003C\u002Fg>\u003C\u002Fg>\u003C\u002Fsvg>\u003C\u002Fp>\u003Ch3 data-line=\"31\" id=\"2.2 SpringBoot项目依赖配置\">2.2 SpringBoot项目依赖配置\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"33\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">xml\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-xml\" language=xml>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">&lt;!-- pom.xml --&gt;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependencies\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>org.springframework.boot\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>spring-boot-starter-web\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>org.springframework.boot\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>spring-boot-starter-data-redis\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>org.springframework.boot\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>spring-boot-starter-amqp\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>org.springframework.boot\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>spring-boot-starter-aop\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>com.google.guava\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>guava\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">version\u003C\u002Fspan>&gt;\u003C\u002Fspan>31.1-jre\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">version\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>org.redisson\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>redisson\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">version\u003C\u002Fspan>&gt;\u003C\u002Fspan>3.17.7\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">version\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependencies\u003C\u002Fspan>&gt;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"65\" id=\"三、核心模块实现详解\">三、核心模块实现详解\u003C\u002Fh2>\n\u003Ch3 data-line=\"67\" id=\"3.1 流量削峰：分布式限流实现\">3.1 流量削峰：分布式限流实现\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"69\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 分布式限流控制器 - 基于Redis+Lua实现精准限流\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Component\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">DistributedRateLimiter\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> RedisTemplate&lt;String, String&gt; redisTemplate;\n    \n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">final\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">RATE_LIMIT_SCRIPT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \n        \u003Cspan class=\"hljs-string\">&quot;local key = KEYS[1]\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local limit = tonumber(ARGV[1])\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local window = tonumber(ARGV[2])\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local current = redis.call(&#x27;get&#x27;, key)\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;if current and tonumber(current) &gt; limit then\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    return 0\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;end\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;current = redis.call(&#x27;incr&#x27;, key)\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;if tonumber(current) == 1 then\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    redis.call(&#x27;expire&#x27;, key, window)\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;end\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;return 1&quot;\u003C\u002Fspan>;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 滑动窗口限流\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">tryAcquire\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String key, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> limit, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> windowSeconds)\u003C\u002Fspan> {\n        List&lt;String&gt; keys = Collections.singletonList(\u003Cspan class=\"hljs-string\">&quot;rate_limit:&quot;\u003C\u002Fspan> + key);\n        \u003Cspan class=\"hljs-type\">Object\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">result\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> redisTemplate.execute(\n            \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">DefaultRedisScript\u003C\u002Fspan>&lt;&gt;(RATE_LIMIT_SCRIPT, Long.class),\n            keys,\n            String.valueOf(limit),\n            String.valueOf(windowSeconds)\n        );\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> result != \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan> &amp;&amp; (Long) result == \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"109\" id=\"3.2 库存扣减：Redis原子操作优化\">3.2 库存扣减：Redis原子操作优化\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"111\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 秒杀库存服务 - 优化版库存扣减\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Service\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">SeckillInventoryService\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> RedisTemplate&lt;String, String&gt; redisTemplate;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 优化后的LUA脚本 - 单次原子操作\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">final\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">STOCK_DEDUCTION_SCRIPT\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \n        \u003Cspan class=\"hljs-string\">&quot;local stockKey = KEYS[1]\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local stockHistoryKey = KEYS[2]\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local userId = ARGV[1]\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local quantity = tonumber(ARGV[2])\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local limit = tonumber(ARGV[3])\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;-- 检查用户是否已经购买过\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local userPurchased = redis.call(&#x27;hget&#x27;, stockHistoryKey, userId)\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;if userPurchased and tonumber(userPurchased) &gt;= limit then\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    return -1  -- 超过限购数量\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;end\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;-- 原子扣减库存\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local stock = tonumber(redis.call(&#x27;get&#x27;, stockKey))\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;if not stock or stock &lt; quantity then\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    return 0  -- 库存不足\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;end\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;-- 执行扣减\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;local result = redis.call(&#x27;decrby&#x27;, stockKey, quantity)\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;if result &gt;= 0 then\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    -- 记录用户购买历史\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    redis.call(&#x27;hincrby&#x27;, stockHistoryKey, userId, quantity)\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    redis.call(&#x27;expire&#x27;, stockHistoryKey, 3600)  -- 1小时过期\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    return 1  -- 成功\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;else\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    -- 回滚库存\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    redis.call(&#x27;incrby&#x27;, stockKey, quantity)\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;    return 0  -- 失败\\n&quot;\u003C\u002Fspan> +\n        \u003Cspan class=\"hljs-string\">&quot;end&quot;\u003C\u002Fspan>;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 安全的库存扣减方法\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> DeductResult \u003Cspan class=\"hljs-title function_\">deductStockWithLimit\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Long itemId, Long userId, Integer quantity, Integer limit)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">stockKey\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;seckill:stock:&quot;\u003C\u002Fspan> + itemId;\n        \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">historyKey\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;seckill:history:&quot;\u003C\u002Fspan> + itemId;\n        \n        List&lt;String&gt; keys = Arrays.asList(stockKey, historyKey);\n        \u003Cspan class=\"hljs-type\">Object\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">result\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> redisTemplate.execute(\n            \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">DefaultRedisScript\u003C\u002Fspan>&lt;&gt;(STOCK_DEDUCTION_SCRIPT, Long.class),\n            keys,\n            userId.toString(),\n            quantity.toString(),\n            limit.toString()\n        );\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> parseDeductResult(result);\n    }\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 库存预热\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">preheatInventory\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(SeckillItem item)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">stockKey\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;seckill:stock:&quot;\u003C\u002Fspan> + item.getId();\n        \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">itemKey\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;seckill:item:&quot;\u003C\u002Fspan> + item.getId();\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 设置库存\u003C\u002Fspan>\n        redisTemplate.opsForValue().set(stockKey, item.getStock().toString());\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 设置商品信息\u003C\u002Fspan>\n        Map&lt;String, String&gt; itemInfo = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashMap\u003C\u002Fspan>&lt;&gt;();\n        itemInfo.put(\u003Cspan class=\"hljs-string\">&quot;name&quot;\u003C\u002Fspan>, item.getName());\n        itemInfo.put(\u003Cspan class=\"hljs-string\">&quot;price&quot;\u003C\u002Fspan>, item.getPrice().toString());\n        itemInfo.put(\u003Cspan class=\"hljs-string\">&quot;startTime&quot;\u003C\u002Fspan>, String.valueOf(item.getStartTime().getTime()));\n        itemInfo.put(\u003Cspan class=\"hljs-string\">&quot;endTime&quot;\u003C\u002Fspan>, String.valueOf(item.getEndTime().getTime()));\n        \n        redisTemplate.opsForHash().putAll(itemKey, itemInfo);\n        redisTemplate.expire(itemKey, Duration.ofHours(\u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>));\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"196\" id=\"3.3 订单处理：异步化与削峰填谷\">3.3 订单处理：异步化与削峰填谷\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"198\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 订单服务 - 基于消息队列的异步处理\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Service\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">OrderService\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> RabbitTemplate rabbitTemplate;\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> OrderMapper orderMapper;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 创建订单 - 异步处理\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> OrderResult \u003Cspan class=\"hljs-title function_\">createOrderAsync\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(SeckillOrderRequest request)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 1. 快速验证\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (!validateRequest(request)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> OrderResult.fail(\u003Cspan class=\"hljs-string\">&quot;请求参数异常&quot;\u003C\u002Fspan>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 2. 发送订单创建消息\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">messageId\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> sendOrderMessage(request);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 3. 立即返回处理中状态\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> OrderResult.processing(messageId);\n    }\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 订单消息消费者\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-meta\">@RabbitListener(queues = &quot;order.create.queue&quot;)\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">handleOrderMessage\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(OrderMessage message)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-keyword\">try\u003C\u002Fspan> {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 1. 重复检查\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (orderMapper.existsByMessageId(message.getMessageId())) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan>;\n            }\n            \n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 2. 创建订单\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-type\">Order\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">order\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> buildOrder(message);\n            orderMapper.insert(order);\n            \n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 3. 发送订单创建成功事件\u003C\u002Fspan>\n            sendOrderCreatedEvent(order);\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C\u002Fspan> (Exception e) {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 4. 失败重试\u003C\u002Fspan>\n            handleOrderFailure(message, e);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 订单状态查询\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> OrderStatus \u003Cspan class=\"hljs-title function_\">queryOrderStatus\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String orderId)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 多级缓存查询\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">OrderStatus\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">status\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> getFromLocalCache(orderId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (status == \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>) {\n            status = getFromRedis(orderId);\n        }\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (status == \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>) {\n            status = getFromDatabase(orderId);\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> status;\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"268\" id=\"3.4 缓存架构：多级缓存设计\">3.4 缓存架构：多级缓存设计\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"270\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 多级缓存服务\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Service\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">MultiLevelCacheService\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> RedisTemplate&lt;String, Object&gt; redisTemplate;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 本地缓存\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">final\u003C\u002Fspan> Cache&lt;String, Object&gt; localCache = CacheBuilder.newBuilder()\n            .maximumSize(\u003Cspan class=\"hljs-number\">10000\u003C\u002Fspan>)\n            .expireAfterWrite(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>, TimeUnit.SECONDS)  \u003Cspan class=\"hljs-comment\">\u002F\u002F 短时间缓存\u003C\u002Fspan>\n            .build();\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 获取商品信息 - 多级缓存策略\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> SeckillItem \u003Cspan class=\"hljs-title function_\">getItemWithCache\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Long itemId)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">cacheKey\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;item:&quot;\u003C\u002Fspan> + itemId;\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 1. 查询本地缓存\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">SeckillItem\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">item\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> (SeckillItem) localCache.getIfPresent(cacheKey);\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (item != \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> item;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 2. 查询Redis缓存\u003C\u002Fspan>\n        item = (SeckillItem) redisTemplate.opsForValue().get(cacheKey);\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (item != \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>) {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 回填本地缓存\u003C\u002Fspan>\n            localCache.put(cacheKey, item);\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> item;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 3. 查询数据库\u003C\u002Fspan>\n        item = getItemFromDB(itemId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (item != \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>) {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 异步更新缓存\u003C\u002Fspan>\n            asyncUpdateCache(cacheKey, item);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> item;\n    }\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 缓存预热\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-meta\">@Async\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">preheatCache\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(List&lt;Long&gt; itemIds)\u003C\u002Fspan> {\n        itemIds.parallelStream().forEach(itemId -&gt; {\n            \u003Cspan class=\"hljs-type\">SeckillItem\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">item\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> getItemFromDB(itemId);\n            \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (item != \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>) {\n                \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">cacheKey\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;item:&quot;\u003C\u002Fspan> + itemId;\n                redisTemplate.opsForValue().set(cacheKey, item, Duration.ofMinutes(\u003Cspan class=\"hljs-number\">30\u003C\u002Fspan>));\n            }\n        });\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"332\" id=\"四、完整秒杀业务流程实现\">四、完整秒杀业务流程实现\u003C\u002Fh2>\n\u003Ch3 data-line=\"334\" id=\"4.1 秒杀控制器\">4.1 秒杀控制器\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"336\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 秒杀API控制器\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@RestController\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@RequestMapping(&quot;\u002Fapi\u002Fseckill&quot;)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Slf4j\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">SeckillController\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> SeckillService seckillService;\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> DistributedRateLimiter rateLimiter;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 秒杀入口\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-meta\">@PostMapping(&quot;\u002F{itemId}&quot;)\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> ResponseEntity&lt;SeckillResponse&gt; \u003Cspan class=\"hljs-title function_\">seckill\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(\n            \u003Cspan class=\"hljs-meta\">@PathVariable\u003C\u002Fspan> Long itemId,\n            \u003Cspan class=\"hljs-meta\">@RequestHeader(&quot;userId&quot;)\u003C\u002Fspan> Long userId,\n            \u003Cspan class=\"hljs-meta\">@RequestBody\u003C\u002Fspan> SeckillRequest request)\u003C\u002Fspan> {\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 1. 基础限流\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (!rateLimiter.tryAcquire(\u003Cspan class=\"hljs-string\">&quot;seckill:&quot;\u003C\u002Fspan> + itemId, \u003Cspan class=\"hljs-number\">1000\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> ResponseEntity.status(\u003Cspan class=\"hljs-number\">429\u003C\u002Fspan>).body(SeckillResponse.fail(\u003Cspan class=\"hljs-string\">&quot;系统繁忙，请稍后重试&quot;\u003C\u002Fspan>));\n        }\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 2. 用户级限流\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (!rateLimiter.tryAcquire(\u003Cspan class=\"hljs-string\">&quot;user:&quot;\u003C\u002Fspan> + userId, \u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">60\u003C\u002Fspan>)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> ResponseEntity.status(\u003Cspan class=\"hljs-number\">429\u003C\u002Fspan>).body(SeckillResponse.fail(\u003Cspan class=\"hljs-string\">&quot;操作过于频繁&quot;\u003C\u002Fspan>));\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C\u002Fspan> {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 3. 执行秒杀\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-type\">SeckillResult\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">result\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> seckillService.executeSeckill(itemId, userId, request);\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> ResponseEntity.ok(SeckillResponse.success(result));\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C\u002Fspan> (SeckillException e) {\n            log.warn(\u003Cspan class=\"hljs-string\">&quot;秒杀业务异常: userId={}, itemId={}&quot;\u003C\u002Fspan>, userId, itemId, e);\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> ResponseEntity.badRequest().body(SeckillResponse.fail(e.getMessage()));\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C\u002Fspan> (Exception e) {\n            log.error(\u003Cspan class=\"hljs-string\">&quot;秒杀系统异常: userId={}, itemId={}&quot;\u003C\u002Fspan>, userId, itemId, e);\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> ResponseEntity.status(\u003Cspan class=\"hljs-number\">500\u003C\u002Fspan>).body(SeckillResponse.fail(\u003Cspan class=\"hljs-string\">&quot;系统异常&quot;\u003C\u002Fspan>));\n        }\n    }\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 查询秒杀结果\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-meta\">@GetMapping(&quot;\u002Fresult\u002F{itemId}&quot;)\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> SeckillResult \u003Cspan class=\"hljs-title function_\">getResult\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(\u003Cspan class=\"hljs-meta\">@PathVariable\u003C\u002Fspan> Long itemId, \n                                  \u003Cspan class=\"hljs-meta\">@RequestHeader(&quot;userId&quot;)\u003C\u002Fspan> Long userId)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> seckillService.getSeckillResult(itemId, userId);\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"395\" id=\"4.2 秒杀核心服务\">4.2 秒杀核心服务\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"397\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 秒杀核心服务\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Service\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Slf4j\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">SeckillService\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> SeckillInventoryService inventoryService;\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> OrderService orderService;\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> RedisTemplate&lt;String, Object&gt; redisTemplate;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 执行秒杀流程\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-meta\">@Transactional(rollbackFor = Exception.class)\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> SeckillResult \u003Cspan class=\"hljs-title function_\">executeSeckill\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Long itemId, Long userId, SeckillRequest request)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 1. 验证秒杀活动状态\u003C\u002Fspan>\n        validateSeckillStatus(itemId);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 2. 库存扣减\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">DeductResult\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">deductResult\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> inventoryService.deductStockWithLimit(\n            itemId, userId, request.getQuantity(), request.getLimit());\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (!deductResult.isSuccess()) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> SeckillResult.fail(deductResult.getMessage());\n        }\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 3. 创建订单\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">OrderResult\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">orderResult\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> orderService.createOrderAsync(\n            buildOrderRequest(itemId, userId, request));\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 4. 记录秒杀结果\u003C\u002Fspan>\n        cacheSeckillResult(itemId, userId, orderResult);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> SeckillResult.success(orderResult.getOrderId());\n    }\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 验证秒杀活动状态\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">validateSeckillStatus\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Long itemId)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-type\">SeckillItem\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">item\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> getSeckillItem(itemId);\n        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">now\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> System.currentTimeMillis();\n        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">startTime\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> item.getStartTime().getTime();\n        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">endTime\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> item.getEndTime().getTime();\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (now &lt; startTime) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">SeckillException\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&quot;秒杀尚未开始&quot;\u003C\u002Fspan>);\n        }\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (now &gt; endTime) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">SeckillException\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&quot;秒杀已结束&quot;\u003C\u002Fspan>);\n        }\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"459\" id=\"五、高级特性与优化方案\">五、高级特性与优化方案\u003C\u002Fh2>\n\u003Ch3 data-line=\"461\" id=\"5.1 分布式锁实现\">5.1 分布式锁实现\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"463\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 分布式锁服务 - 防止重复秒杀\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Component\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">DistributedLockService\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-meta\">@Autowired\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> RedissonClient redisson;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 执行带锁的秒杀操作\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> SeckillResult \u003Cspan class=\"hljs-title function_\">executeWithLock\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String lockKey, \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> waitTime, \n                                        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> leaseTime, Supplier&lt;SeckillResult&gt; supplier)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-type\">RLock\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">lock\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> redisson.getLock(lockKey);\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C\u002Fspan> {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 尝试获取锁\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS)) {\n                \u003Cspan class=\"hljs-keyword\">try\u003C\u002Fspan> {\n                    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> supplier.get();\n                } \u003Cspan class=\"hljs-keyword\">finally\u003C\u002Fspan> {\n                    lock.unlock();\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> SeckillResult.fail(\u003Cspan class=\"hljs-string\">&quot;系统繁忙，请重试&quot;\u003C\u002Fspan>);\n            }\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C\u002Fspan> (InterruptedException e) {\n            Thread.currentThread().interrupt();\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> SeckillResult.fail(\u003Cspan class=\"hljs-string\">&quot;系统异常&quot;\u003C\u002Fspan>);\n        }\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"499\" id=\"5.2 熔断降级策略\">5.2 熔断降级策略\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"501\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 熔断降级服务\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Component\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">CircuitBreakerService\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">final\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">CircuitBreaker\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">circuitBreaker\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CircuitBreaker.ofDefaults(\u003Cspan class=\"hljs-string\">&quot;seckillService&quot;\u003C\u002Fspan>);\n    \n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 带熔断保护的秒杀操作\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> SeckillResult \u003Cspan class=\"hljs-title function_\">executeWithCircuitBreaker\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Supplier&lt;SeckillResult&gt; supplier)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> CircuitBreaker.decorateSupplier(circuitBreaker, () -&gt; {\n            \u003Cspan class=\"hljs-keyword\">try\u003C\u002Fspan> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> supplier.get();\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C\u002Fspan> (Exception e) {\n                log.error(\u003Cspan class=\"hljs-string\">&quot;秒杀服务异常&quot;\u003C\u002Fspan>, e);\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> SeckillResult.fail(\u003Cspan class=\"hljs-string\">&quot;服务暂时不可用&quot;\u003C\u002Fspan>);\n            }\n        }).get();\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"526\" id=\"六、性能优化与监控\">六、性能优化与监控\u003C\u002Fh2>\n\u003Ch3 data-line=\"528\" id=\"6.1 应用配置优化\">6.1 应用配置优化\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"530\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">yaml\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-yaml\" language=yaml>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\"># application.yml\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attr\">server:\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">port:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">8080\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">tomcat:\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">max-threads:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">1000\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">min-spare-threads:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">100\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">max-connections:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">10000\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-attr\">spring:\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">redis:\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">host:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">localhost\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">port:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">6379\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">lettuce:\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">pool:\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">max-active:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">100\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">max-wait:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">1000ms\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">rabbitmq:\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">host:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">localhost\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">port:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">5672\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">listener:\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">simple:\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-attr\">prefetch:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>  \u003Cspan class=\"hljs-comment\"># 控制并发消费\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-comment\"># 秒杀配置\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attr\">seckill:\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">rate-limit:\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">global:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">10000\u003C\u002Fspan>  \u003Cspan class=\"hljs-comment\"># 全局QPS限制\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">user:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>        \u003Cspan class=\"hljs-comment\"># 用户级QPS限制\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">inventory:\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">preheat-time:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">30\u003C\u002Fspan>  \u003Cspan class=\"hljs-comment\"># 库存预热时间(分钟)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"563\" id=\"6.2 监控指标收集\">6.2 监控指标收集\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"565\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F**\n * 秒杀监控服务\n *\u002F\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Component\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Slf4j\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">SeckillMetricsService\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">final\u003C\u002Fspan> MeterRegistry meterRegistry;\n    \n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 关键指标\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">final\u003C\u002Fspan> Counter successCounter;\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">final\u003C\u002Fspan> Counter failureCounter;\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">final\u003C\u002Fspan> Timer seckillTimer;\n    \n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">SeckillMetricsService\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(MeterRegistry meterRegistry)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>.meterRegistry = meterRegistry;\n        \u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>.successCounter = Counter.builder(\u003Cspan class=\"hljs-string\">&quot;seckill.success&quot;\u003C\u002Fspan>)\n                .description(\u003Cspan class=\"hljs-string\">&quot;秒杀成功次数&quot;\u003C\u002Fspan>)\n                .register(meterRegistry);\n        \u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>.failureCounter = Counter.builder(\u003Cspan class=\"hljs-string\">&quot;seckill.failure&quot;\u003C\u002Fspan>)\n                .description(\u003Cspan class=\"hljs-string\">&quot;秒杀失败次数&quot;\u003C\u002Fspan>)\n                .register(meterRegistry);\n        \u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>.seckillTimer = Timer.builder(\u003Cspan class=\"hljs-string\">&quot;seckill.duration&quot;\u003C\u002Fspan>)\n                .description(\u003Cspan class=\"hljs-string\">&quot;秒杀耗时&quot;\u003C\u002Fspan>)\n                .register(meterRegistry);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">recordSeckillSuccess\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(\u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> duration)\u003C\u002Fspan> {\n        successCounter.increment();\n        seckillTimer.record(duration, TimeUnit.MILLISECONDS);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">recordSeckillFailure\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String reason)\u003C\u002Fspan> {\n        failureCounter.increment();\n        log.warn(\u003Cspan class=\"hljs-string\">&quot;秒杀失败: {}&quot;\u003C\u002Fspan>, reason);\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"605\" id=\"七、压测与性能数据\">七、压测与性能数据\u003C\u002Fh2>\n\u003Ch3 data-line=\"607\" id=\"7.1 JMeter压测配置\">7.1 JMeter压测配置\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"609\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">xml\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-xml\" language=xml>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">&lt;!-- 秒杀压测计划 --&gt;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">ThreadGroup\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">numThreads\u003C\u002Fspan>&gt;\u003C\u002Fspan>1000\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">numThreads\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">rampUp\u003C\u002Fspan>&gt;\u003C\u002Fspan>10\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">rampUp\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">loopCount\u003C\u002Fspan>&gt;\u003C\u002Fspan>100\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">loopCount\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">ThreadGroup\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">HTTPRequest\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">method\u003C\u002Fspan>&gt;\u003C\u002Fspan>POST\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">method\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">path\u003C\u002Fspan>&gt;\u003C\u002Fspan>\u002Fapi\u002Fseckill\u002F123\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">path\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">header\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">name\u003C\u002Fspan>=\u003Cspan class=\"hljs-string\">&quot;userId&quot;\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">value\u003C\u002Fspan>=\u003Cspan class=\"hljs-string\">&quot;${__Random(1,100000)}&quot;\u003C\u002Fspan>\u002F&gt;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">HTTPRequest\u003C\u002Fspan>&gt;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"624\" id=\"7.2 性能基准\">7.2 性能基准\u003C\u002Fh3>\n\u003Cp data-line=\"626\">经过优化后的系统可实现：\u003C\u002Fp>\n\u003Cul data-line=\"627\">\n\u003Cli data-line=\"627\">\u003Cstrong>QPS处理能力\u003C\u002Fstrong>：10万+ 请求\u002F秒\u003C\u002Fli>\n\u003Cli data-line=\"628\">\u003Cstrong>响应时间\u003C\u002Fstrong>：平均50ms，P99在200ms以内\u003C\u002Fli>\n\u003Cli data-line=\"629\">\u003Cstrong>库存准确性\u003C\u002Fstrong>：100% 无超卖\u003C\u002Fli>\n\u003Cli data-line=\"630\">\u003Cstrong>系统可用性\u003C\u002Fstrong>：99.99%\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 data-line=\"632\" id=\"总结与最佳实践\">总结与最佳实践\u003C\u002Fh2>\n\u003Ch3 data-line=\"634\" id=\"8.1 核心经验总结\">8.1 核心经验总结\u003C\u002Fh3>\n\u003Col data-line=\"636\">\n\u003Cli data-line=\"636\">\u003Cstrong>分层防御\u003C\u002Fstrong>：从网关到数据库的多层防护\u003C\u002Fli>\n\u003Cli data-line=\"637\">\u003Cstrong>异步化\u003C\u002Fstrong>：消息队列解耦，提升系统吞吐量\u003C\u002Fli>\n\u003Cli data-line=\"638\">\u003Cstrong>缓存策略\u003C\u002Fstrong>：多级缓存减少数据库压力\u003C\u002Fli>\n\u003Cli data-line=\"639\">\u003Cstrong>限流熔断\u003C\u002Fstrong>：保护系统不被流量冲垮\u003C\u002Fli>\n\u003Cli data-line=\"640\">\u003Cstrong>监控告警\u003C\u002Fstrong>：实时掌握系统健康状况\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 data-line=\"642\" id=\"8.2 避坑指南\">8.2 避坑指南\u003C\u002Fh3>\n\u003Col data-line=\"644\">\n\u003Cli data-line=\"644\">\u003Cstrong>避免在Lua脚本中执行复杂操作\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli data-line=\"645\">\u003Cstrong>合理设置缓存过期时间\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli data-line=\"646\">\u003Cstrong>消息队列要做好幂等处理\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli data-line=\"647\">\u003Cstrong>监控指标要覆盖业务维度\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli data-line=\"648\">\u003Cstrong>压测要模拟真实场景\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr data-line=\"650\">\n\u003Cp data-line=\"652\">\u003Cstrong>技术标签\u003C\u002Fstrong>：\u003Ccode>#高并发\u003C\u002Fcode> \u003Ccode>#秒杀系统\u003C\u002Fcode> \u003Ccode>#SpringBoot\u003C\u002Fcode> \u003Ccode>#Redis\u003C\u002Fcode> \u003Ccode>#分布式系统\u003C\u002Fcode> \u003Ccode>#性能优化\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp data-line=\"654\">通过本文的完整实现方案，您可以构建出能够应对百万级并发的秒杀系统。记住，高并发系统不仅是技术的堆砌，更是对业务深刻理解后的架构艺术。\u003C\u002Fp>\n",15199,50,"0","",2,0,8,"&quot,秒杀,public,系统,return","\n本文基于淘宝秒杀系统实战经验，结合SpringBoot技术栈，深度解析高并发秒杀系统的架构设计与实现方案。\n\n引言：从一场价值10亿的秒杀事故说起\n&quot;王工！秒杀活动开始3秒，服务器全挂了！&quot;凌晨2点接到这个电话时，我后背瞬间湿透。那是2019年双11前夕，我们团队负责的某品牌手机秒杀活动，因并发设计缺陷导致系统雪崩，直接损失预估10亿。","2025-12-20 23:44:20"]