






















方案1:数据库乐观锁
优点:实现简单、无需额外中间件
缺点: 可能出现大量更新失败、高并发时DB压力大
方案2:Redis原子操作
Redis原子操作的核心原理是使用:Redis + Lua脚本。
扣减成功后写入消息队列;扣减失败返回秒杀失败
性能对比:
// Lua脚本保证原子性 String lua = "if redis.call('get', KEYS >= ARGV[1] then " + "return redis.call('decrby', KEYS[1], ARGV " + "else return -1 end"; public boolean preDeduct(String itemId, int count) { RedisScript<Long> script = new DefaultRedisScript<>(lua, Long.class); Long result = redisTemplate.execute(script, Collections.singletonList(itemId), count); return result != null && result >= 0; }
方案3: 分布式锁
最常用的分布式锁的方案是Redisson
注意事项
方案4:消息队列削峰
可以使用 RocketMQ的事务消息

技术指标:
// RocketMQ事务消息示例 TransactionMQProducer producer = new TransactionMQProducer("stock_group"); producer.setExecutor(new TransactionListener() { @Override public LocalTransactionState executeLocalTransaction(Message msg) { // 扣减数据库库存 return LocalTransactionState.COMMIT_MESSAGE; } });
方案5:预扣库存
预扣库存是防止商品超卖的终极方案。用户提交订单时,做的是reids中库存预扣,只有当实际支付完成后,才会做数据库层的库存扣减。
// Guava RateLimiter限流 RateLimiter limiter = RateLimiter.create(1000); // 每秒1000个令牌 public boolean preDeduct(Long itemId) { if (!limiter.tryAcquire()) return false; // 写入预扣库存表 preStockDao.insert(itemId, userId); return true; }

性能数据:
其实在很多大厂中,一般会将防止商品超卖的多种方案组合使用。
架构图如下:

通过组合使用:
实战经验:某电商在2023年双11中:
系统平稳支撑了每秒12万次秒杀请求,0超卖事故发生!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。