--[[ 完整秒杀 Lua 脚本 =========================================================== KEYS[1] = seckill:stock:{item_id} 库存计数 (String) KEYS[2] = seckill:users:{item_id} 已购用户集合 (Set) KEYS[3] = seckill:orders 订单消息流 (Stream) ARGV[1] = user_id ARGV[2] = item_id ARGV[3] = order_id (uuid) 返回值: 1 抢购成功 0 库存不足 -1 重复购买 -2 商品不存在 / 未预热 =========================================================== 说明: - Redis 单线程执行 Lua,整个脚本期间不会被打断 - 一次脚本同时完成「防重 + 判库存 + 扣减 + 推消息」4 件事 - 失败用负数区分原因,方便客户端做不同提示 ]] if redis.call('EXISTS', KEYS[1]) == 0 then return -2 end if redis.call('SISMEMBER', KEYS[2], ARGV[1]) == 1 then return -1 end local s = tonumber(redis.call('GET', KEYS[1])) if not s or s <= 0 then return 0 end redis.call('DECR', KEYS[1]) redis.call('SADD', KEYS[2], ARGV[1]) redis.call('XADD', KEYS[3], '*', 'order_id', ARGV[3], 'user_id', ARGV[1], 'item_id', ARGV[2], 'ts', redis.call('TIME')[1]) return 1