摘要:在电商秒杀、抢票等高并发场景中,库存扣减是核心链路中最容易出问题的环节。传统的数据库行锁方案在流量洪峰面前往往不堪一击,导致接口超时甚至数据库宕机。本文将以真实的秒杀业务为背景,深入剖析从“数据库锁”到\”Redis 原子脚本”再到\”MQ 异步削峰”的架构演进过程,提供一套经过生产环境验证的高可用库存扣减方案。
一、业务背景与痛点分析
假设我们正在进行一场热门商品的秒杀活动,库存仅有 1000 件,但瞬时并发请求量高达 10 万 QPS。在早期的 V1.0 版本中,我们采用了最直接的数据库更新方案:
UPDATE stock SET count = count – 1 WHERE id = 1001 AND count > 0;
V1.0 方案的问题:
面对这种场景,我们必须将流量挡在数据库之外,利用缓存抗压,并保证数据的一致性。
二、架构演进:Redis Lua 脚本保证原子性
为了解决数据库压力,我们将库存预热到 Redis 中。但单纯的 DECR 命令无法处理复杂的业务校验(如限购、用户资格等)。此时,Lua 脚本成为了最佳选择。Redis 执行 Lua 脚本是单线程的,天然保证了原子性。
核心 Lua 脚本逻辑
— KEYS[1]: 库存 Key
— ARGV[1]: 用户 ID
— ARGV[2]: 购买数量
— ARGV[3]: 限购数量
local stock = tonumber(redis.call(\’get\’, KEYS[1]))
if not stock then return –1 end — 库存不存在
if stock < tonumber(ARGV[2


