当前位置: 首页 > news >正文

《一个学习型秒杀项目:Redis + 乐观锁,我是如何实现“一人一单”的》

Redis / 高并发 / 秒杀系统

一、项目背景

这是一个学习型项目,目标是模拟优惠券秒杀的三个核心功能:

  • 用户秒杀抢券

  • 一人一单限制

  • 防止超卖

技术栈:Spring Boot + Redis + MySQL + Lua。


二、第一版:最简单的扣库存

第一版我直接用数据库扣减:

sql

update coupon set stock = stock - 1 where id = #{id};

压测发现两个问题:

  1. 超卖:高并发下,多个请求同时读到 stock=1,然后都执行了减 1,变成负数

  2. 一人多单:同一个用户发了 10 个请求,抢到 10 张券


三、解决超卖:乐观锁

我用乐观锁改造了扣库存 SQL:

sql

update coupon set stock = stock - 1 where id = #{id} and stock > 0;

再配合版本号或直接判断受影响行数。

效果:不再超卖,但并发能力一般。本地测试 QPS 大约 50。


四、解决一人一单:Redis Set

为了限制同一个用户只能抢一张,我用 Redis 的 Set 结构:

  • key:seckill:user:{couponId}

  • value:userId

抢之前先判断是否存在:

java

if (redis.sismember(key, userId)) { return "已抢过"; }

抢成功后,再sadd

这样就实现了一人一单


五、进一步优化:Lua 脚本保证原子性

我注意到上面两步(校验 + 扣减)不是原子的。万一在判断和扣减之间出现了并发,还是可能出问题。

所以我改成了Lua 脚本,把库存扣减 + 一人一单校验放在一个脚本里,一次性在 Redis 中完成。

lua

-- 伪代码 local stock = redis.call('get', stockKey) if stock <= 0 then return -1 end local isMember = redis.call('sismember', userKey, userId) if isMember == 1 then return 0 end redis.call('decr', stockKey) redis.call('sadd', userKey, userId) return 1

六、压测结果
方案QPS是否有超卖一人一单
纯数据库50❌ 有❌ 无
乐观锁50✅ 无❌ 无
乐观锁 + Redis Set120✅ 无✅ 有
Lua 脚本 + Set200✅ 无✅ 有

七、我还遇到了一个坑

秒杀瞬间 Redis 压力很大,所有的请求都在 Redis 上做校验和扣减。我后面考虑用异步下单来削峰,简单用 Redis Stream 做了一个队列,秒杀成功后先返回“排队中”,后端再慢慢处理。

这个还没做到完美,是我下一步想继续优化的点。


八、总结

这个项目让我学到了:

  • 不要一上来就搞“分布式锁”,很多场景 Redis Set + Lua 就够了

  • 八股文里的“缓存穿透、击穿、雪崩”,只有真正写代码才会理解细节

  • 秒杀系统的核心不是“快”,而是不超卖 + 不重复

http://www.jsqmd.com/news/914564/

相关文章:

  • 乳山市黄金回收白银回收门店推荐 2026年最新黄金回收门店口碑排行榜+联系方式 - 盛世金银回收
  • 2026年龙井市最新黄金回收靠谱门店口碑榜 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • Windows Server 2022下,手把手教你用iSCSI连接华为OceanStor存储(含MPIO多路径配置)
  • SAP ECC6 2027年停服倒计时:中小企业主必看的4条出路与成本分析
  • 别再说STM32F103跑不动GUI了!手把手教你用SPI屏+TouchGFX在256KB RAM的MCU上跑Demo
  • 盘州市黄金回收白银回收门店推荐 2026年最新黄金回收门店口碑排行榜+联系方式 - 盛世金银回收
  • 大模型安全对齐技术深度解析:从 Constitutional AI 到自动化红队测试的全栈安全训练体系
  • 2026年靖江市最新黄金回收靠谱门店口碑榜 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 2026年康定市最新黄金回收靠谱门店口碑榜 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 2026年龙口市最新黄金回收靠谱门店口碑榜 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • Rydberg原子阵列与量子行走实现原理详解
  • 彭州市黄金回收白银回收门店推荐 2026年最新黄金回收门店口碑排行榜+联系方式 - 盛世金银回收
  • Python办公自动化新思路:用pywinauto操控微信/钉钉实现消息自动收发与文件管理
  • 构建具备自主意识的AI笑话生成系统:从认知架构到强化学习实战
  • 从零搭建 CAD 智能体集群,A2A 协议全流程解析
  • ESP32C3串口玩出新花样:除了Serial,如何用HardwareSerial库自由配置多组TX/RX引脚
  • 建瓯市黄金回收白银回收门店推荐 2026年最新黄金回收门店口碑排行榜+联系方式 - 盛世金银回收
  • 2026年克拉玛依市最新黄金回收靠谱门店口碑榜 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 邳州市黄金回收白银回收门店推荐 2026年最新黄金回收门店口碑排行榜+联系方式 - 盛世金银回收
  • 别再只会调库了!手把手教你用STM32的TIM3寄存器配置PWM驱动直流电机
  • 05-RAG知识库与向量检索
  • 2025-2026年国内韩国留学机构推荐:口碑好的产品解决工薪家庭孩子留学成本高痛点 - 品牌推荐
  • 从C/C++到汇编:深入理解浮点数比较的‘坑’与FCOM/FCOMI的正确用法
  • 2026年龙南市最新黄金回收靠谱门店口碑榜 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • AI如何击败顶尖律师?揭秘人机对决背后的策划与价值
  • 2026年昆明市最新黄金回收靠谱门店口碑榜 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 江门市黄金回收白银回收门店推荐 2026年最新黄金回收门店口碑排行榜+联系方式 - 盛世金银回收
  • 告别手动!用Python脚本5分钟清空你的Gitee仓库(附完整代码)
  • 卖铝箔怎么找客户?下游工厂在哪里
  • 2025-2026年上海靠谱搬家公司推荐:口碑好的服务解决跨城搬家物品多且易损注意事项 - 品牌推荐