news 2026/4/1 4:49:22

Spring Boot + Redis + Lua 打造高并发秒杀系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot + Redis + Lua 打造高并发秒杀系统

Spring Boot + Redis + Lua 打造高并发秒杀系统

—— 防超卖 / 库存预热 / 流量削峰 / 生产级设计完整版

在高并发业务场景中,秒杀系统几乎是所有后端工程师绕不开的一道“必修课”。 它同时考验:

  • 高并发处理能力
  • 分布式一致性设计
  • Redis 使用深度
  • 系统稳定性与可恢复性
  • 工程经验与架构能力

一个合格的秒杀系统,至少要解决四个核心问题:

  1. 不能超卖:库存必须绝对准确
  2. 不能击穿系统:瞬时流量必须被削峰
  3. 不能重复下单:要有强幂等性
  4. 不能丢订单:Redis、MQ、DB 之间要最终一致

本文将基于一个完整的:

Spring Boot + Redis + Lua + 消息队列 的秒杀系统方案

从 0 到 1 设计一个生产级高并发秒杀系统,并且:

  • 保留所有可运行代码
  • Lua 脚本原子扣减库存
  • 支持库存预热
  • 多级限流削峰
  • 异步下单
  • 可补偿、可对账、可降级

一、系统整体架构设计

基础架构如下

这基本就是淘宝、京东、美团等互联网公司秒杀的真实架构缩影。


二、系统设计的五大核心原则

在开始写代码之前,必须先统一系统设计目标:

1. 原子性

库存扣减必须是不可分割的操作

判断库存 → 扣减库存 → 记录用户 → 生成订单信息 必须要么全部成功,要么全部失败

这正是 Lua 脚本存在的意义。


2. 幂等性

同一个用户:

  • 不能下两次订单
  • MQ 重试不能造成多单
  • 网络抖动不能造成重复写库

你现在已经在 Redis 层用:

SISMEMBER userSetKey userId

做了第一层幂等,这是非常专业的设计。

后面我们会补上:

  • 数据库唯一索引
  • MQ 消费端幂等

形成 双重保险


3. 削峰填谷

秒杀流量是典型的:

1 秒内爆发 → 10 万 QPS

但数据库最多只能抗几百 QPS。

所以必须:

请求 → Redis 快速失败 成功请求 → MQ 排队 MQ → 平滑写 DB

Redis + MQ 是整个系统“抗洪水”的核心。


4. 最终一致性

Redis 扣库存成功 ≠ 订单一定成功。

可能发生:

  • MQ 发送失败
  • MQ 消费失败
  • DB 插入失败

因此我们必须引入:

  • 冻结库存模型
  • 失败补偿机制
  • 对账机制

后面会专门一节讲。


5. 降级与熔断

任何系统都会出问题:

故障应对
Redis 慢返回“排队中”
Redis 挂秒杀入口关闭
MQ 挂只做 Redis 预扣,不下单
DB 慢订单排队

秒杀系统不是“永远成功”,而是永远可控失败


三、技术选型说明

组件作用
Spring Boot服务骨架
Redis高性能缓存 + 原子操作
Lua原子库存扣减
Redisson分布式锁 / 限流
MQ(RabbitMQ/Kafka)削峰 + 异步
MySQL最终订单存储
Prometheus + Grafana监控告警

四、Redis + Lua 原子库存模型设计(防超卖核心)

在秒杀系统中,库存扣减是整个系统最敏感、最关键的一环。 如果这里出问题,后面所有架构设计全部失去意义。

为什么必须用 Lua?

因为:

  • Redis 单条命令是原子的
  • 但多条命令组合不是原子的
  • Lua 脚本在 Redis 内部执行,天生保证 原子性

即:

Lua = 分布式系统里的“原子事务”


4.1 Redis Key 设计

在你的方案中,Key 设计非常规范:

Key含义
seckill:stock:{productId}商品库存
seckill:users:{productId}已成功秒杀用户集合
seckill:order:{orderId}订单信息
seckill:activity:{productId}活动信息
seckill:sold:{productId}已售数量(统计用)

这是一个非常“工程化”的 Key 设计,既方便业务,又方便运维。


4.2 原始 Lua 脚本

你设计的 Lua 脚本已经是生产级写法,这里完整保留:

-- KEYS[1]: 商品库存key -- KEYS[2]: 秒杀成功用户集合key -- ARGV[1]: 用户ID -- ARGV[2]: 购买数量 -- ARGV[3]: 活动开始时间 -- ARGV[4]: 活动结束时间 -- 1. 参数校验 if #KEYS ~= 2 or #ARGV ~= 4 then return -1 -- 参数错误 end local stockKey = KEYS[1] local userSetKey = KEYS[2] local userId = ARGV[1] local quantity = tonumber(ARGV[2]) local startTime = tonumber(ARGV[3]) local endTime = tonumber(ARGV[4]) -- 2. 检查活动时间 local currentTime = redis.call('TIME')[1] if currentTime < startTime then return -2 -- 活动未开始 end if currentTime > endTime then return -3 -- 活动已结束 end -- 3. 检查用户是否重复购买 local exists = redis.call('SISMEMBER', userSetKey, userId) if exists == 1 then return -4 -- 重复购买 end -- 4. 获取库存并检查 local stock = redis.call('GET', stockKey) if not stock then return -5 -- 商品不存在 end stock = tonumber(stock) if stock <= 0 then return -6 -- 库存不足 end if stock < quantity then return -7 -- 库存不足 end -- 5. 扣减库存 redis.call('DECRBY', stockKey, quantity) -- 6. 添加用户到已购买集合 redis.call('SADD', userSetKey, userId) -- 7. 设置用户过期时间(活动结束后1小时) redis.call('EXPIREAT', userSetKey, endTime + 3600) -- 8. 记录订单信息到Hash local orderId = string.format("ORDER:%s:%s", userId, currentTime) local orderKey
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 17:15:00

苏州大学突破:新型注意力机制赋能AI语境适应性对话

这项由苏州大学联合百度公司进行的前沿研究发表于2026年1月24日&#xff0c;论文编号为arXiv:2601.17367v1&#xff0c;为大型语言模型的效率优化领域带来了重要突破。想了解完整技术细节的读者可以通过该论文编号查询原文。当我们人类处理信息时&#xff0c;会根据任务的重要性…

作者头像 李华
网站建设 2026/3/5 17:37:47

softmax函数与logits

softmax 函数有一种独特的优雅&#xff1a; softmax(zi)ezi∑jezj\text{softmax}(z_i) \frac{e^{z_i}}{\sum_j e^{z_j}}softmax(zi​)∑j​ezj​ezi​​ 这个函数将原始输出&#xff0c;仅仅是数字、logits&#xff0c;转换成了概率分布。 它最美妙之处在于它处理竞争的方式…

作者头像 李华
网站建设 2026/3/27 14:51:55

Java计算机毕设之基于SpringBoot+Spark的买菜推荐系统设计与实现基于spark的买菜推荐系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/29 16:36:36

探索光伏电池并网运行仿真模型:基于Matlab/Simulink的实践之旅

光伏电池并网运行仿真模型 Matlab/Simulink仿真模型 模拟了光伏电池发电后经过逆变并入三相电网的过程 在如今对清洁能源日益重视的时代&#xff0c;光伏电池作为可持续能源的关键角色&#xff0c;其并网运行的研究至关重要。借助Matlab/Simulink强大的仿真功能&#xff0c;我们…

作者头像 李华