一人一单的架构

📅 2026/7/10 5:15:17
一人一单的架构
一人一单 — 多层防护体系防护层次用户请求秒杀│▼┌─ 第一层: Redis Lua 原子去重 ────────────────────────────────────┐│ SISMEMBER seckill:order:{voucherId} userId ││ 如果已存在 → return 2 (不能重复下单) ││ 首次购买 → SADD 加入 Set ││ 特点: 零锁开销O(1) 复杂度内存级判断 │└───────────────────────────────────────────────────────────────────┘│▼┌─ 第二层: Redisson 分布式锁 ──────────────────────────────────────┐│ RLock lock redissonClient.getLock(lock:order: userId) ││ lock.tryLock() ← 非阻塞尝试拿不到直接拒绝│ 特点: 用户维度隔离锁粒度 用户ID ││ WatchDog: 每 10 秒自动续期默认 30s 过期│ 避免了「业务执行超过锁过期时间→锁被误删→其他线程进来」的经典问题 │└───────────────────────────────────────────────────────────────────┘│▼┌─ 第三层: MySQL 乐观锁 唯一索引 ────────────────────────────────┐│ UPDATE tb_seckill_voucher ││ SET stock stock - 1 ││ WHERE voucher_id ? AND stock 0 ← CAS 条件 ││ 如果 affected rows 0 → 库存不足终止 ││ 如果 affected rows 1 → 扣减成功插入订单 ││ user_id voucher_id 联合唯一索引 ← 最后兜底 │└───────────────────────────────────────────────────────────────────┘