域名注册空间网站中国产品设计网

张小明 2025/12/31 18:59:12
域名注册空间网站,中国产品设计网,外贸公司大全,中国公路建设行业协会网站这么上不#x1f525; 前言#xff1a;为什么你的秒杀系统一上线就崩#xff1f; 场景还原#xff1a; 某电商平台搞促销#xff0c;限量 100 台 iPhone 15 Pro Max#xff0c;售价 9.9 元。 活动开始前#xff0c;运营还在群里喊#xff1a;“大家准备好#xff0c;流量要来… 前言为什么你的秒杀系统一上线就崩场景还原某电商平台搞促销限量 100 台 iPhone 15 Pro Max售价 9.9 元。活动开始前运营还在群里喊“大家准备好流量要来了”活动开始第 0.1 秒数据库 CPU 飙升 100%连接池爆满整个 App 页面转圈圈最后报 502。老板脸色铁青用户骂声一片。这是初级开发者最容易遇到的“秒杀惨案”。秒杀系统的核心难点只有一个如何在极短时间内处理远超数据库承受能力的并发请求且保证库存不扣成负数超卖。今天我就带大家复盘一个秒杀系统从100 TPS直连数据库优化到10 万 TPSRedis MQ的完整架构演进之路。 第一阶段青铜时代 —— 悲观锁与数据库死锁最早期的版本我们想得很简单用数据库行锁解决并发问题。伪代码-- 开启事务STARTTRANSACTION;-- 1. 查询库存并加锁 (悲观锁)SELECTstockFROMgoodsWHEREid1FORUPDATE;-- 2. 判断库存IFstock0THEN-- 3. 扣减库存UPDATEgoodsSETstockstock-1WHEREid1;-- 4. 创建订单INSERTINTOorders...;ENDIF;COMMIT;结局TPS ≈ 100在FOR UPDATE下所有请求变成了串行执行。如果有 1 万人抢购第 1 个人锁住了这行数据后面 9999 个人都在排队等待锁释放。数据库直接成为瓶颈甚至因为锁等待超时引发雪崩。 第二阶段白银时代 —— 乐观锁的“重试地狱”为了去掉悲观锁我们引入了乐观锁CAS 思想。SQL 改进-- 不需要查出来加锁直接在 Update 时判断条件UPDATEgoodsSETstockstock-1WHEREid1ANDstock0;结局TPS ≈ 500虽然没有了显式的锁等待但在高并发下大量请求同时竞争同一行记录的写锁 (InnoDB Row Lock)。MySQL 依然扛不住几万 QPS 的写入。更糟糕的是如果库存充裕大量失败的请求需要由业务层进行重试导致网络风暴。 第三阶段黄金时代 —— Redis Lua 脚本抗住 10 万并发我们要明白一个铁律高并发秒杀绝对不能让流量直接打到 MySQL。库存扣减必须在内存中完成。Redis 是单线程的天然无锁且高性能。但我们有两个操作GET(查库存) 和DECR(扣库存)。如果在 Java 里分两步调 Redis会有并发安全问题超卖。解决方案Redis Lua 脚本Lua 脚本可以保证多条 Redis 命令的原子性。在 Redis 服务器看来这个脚本就是一个整体执行期间不会插入其他命令。核心 Lua 脚本 (seckill.lua)-- KEYS[1]: 商品库存Key-- ARGV[1]: 扣减数量localstockredis.call(get,KEYS[1])if(stockandtonumber(stock)tonumber(ARGV[1]))then-- 库存充足执行扣减redis.call(decrby,KEYS[1],ARGV[1])return1-- 成功elsereturn0-- 失败endJava 调用代码// 使用 StringRedisTemplate 执行 Lua 脚本LongresultstringRedisTemplate.execute(newDefaultRedisScript(scriptText,Long.class),Collections.singletonList(goods:stock:1001),1);if(result1){// 扣减成功进入下一步异步下单}else{thrownewBizException(手慢了已抢光);}结局TPS 飙升至 10wRedis 单机理论 TPS 可达 10w。通过 Lua 脚本我们把复杂的锁竞争变成了极其高效的内存计数器操作。流量被完美挡在了缓存层。 第四阶段王者时代 —— 消息队列“削峰填谷”Redis 扣减成功了但订单还没生成。如果此时直接调用 MySQL 去INSERT orderMySQL 还是会挂。因为 Redis 这一层漏下来的成功请求假设库存 1 万在一秒内涌入 MySQL依然是灾难。解决方案MQ 异步解耦Redis 扣减成功后不操作数据库而是向 RocketMQ/Kafka 发送一条“创建订单消息”。消费者 (Consumer)按照数据库能承受的速度例如每秒处理 2000 个慢慢拉取消息并写入 MySQL。最终架构图异步持久层削峰填谷层缓存抗压层Nginx负载均衡1. 执行 Lua 脚本库存不足库存扣减成功堆积消息2. 慢速拉取3. 写入订单订单消费者MySQL 数据库RocketMQ / Kafka消息缓冲池Redis集群Web服务集群返回: 已抢光海量用户请求️ 常见问题缓存与数据库不一致怎么办问如果 Redis 扣减成功但 MQ 发送失败或者消费者写库失败怎么办这涉及到了分布式事务的最终一致性。本地消息表在 Redis 扣减前先记录一条“消息发送记录”。MQ 可靠性投递使用 RocketMQ 的事务消息。库存回滚如果消费者下单失败例如用户已超过限购数量必须发送“回滚消息”把 Redis 里的库存加回去 (INCRBY)。 总结从 100 TPS 到 10 万 TPS秒杀系统的本质就是“层层过滤漏斗模型”Nginx/网关层拦截恶意刷单。Redis 层利用 Lua 原子性抗住 99% 的读写流量。MQ 层将瞬时流量拉平保护脆弱的数据库。数据库层只处理最终有效的少量写请求。没有最牛的架构只有最适合业务场景的取舍。博主留言想看Redis Lua 脚本的完整文件以及RocketMQ 削峰的具体配置吗在评论区回复“秒杀”我发给你一份《高并发秒杀系统微服务工程源码》拿去跑个压测试试
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

asp连接数据库做登录网站完整下载重庆设计院

STM32如何“掌舵”智能小车?从代码到PCB布局的硬核实战指南你有没有遇到过这样的情况:程序写得没问题,电机控制逻辑也对,可小车一启动,STM32就莫名其妙复位?或者超声波测距忽远忽近,ADC采样像在…

张小明 2025/12/29 16:41:40 网站建设

企业网站开发注意什么郑州最新发展

Source Han Serif思源宋体:免费开源中文字体专业应用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为字体版权问题而烦恼?Source Han Serif思源宋体为…

张小明 2025/12/29 22:10:50 网站建设

最好的免费软件网站建设租车做什么网站推广

大家好,我是明哥。记得刚开始第一次接触茅台,那时候1499价格,同事买到后我从手里购买了一瓶,那时候市场价1899左右。这一瓶过年就喝了,随后就发现飞天茅台飞涨,于是就开始去找从哪里可以买到我,…

张小明 2025/12/30 5:26:38 网站建设

建一个英文网站需要多少钱园林绿化

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、基础篇 1、请介绍一下,APP测试流程? APP测试流程与web测试流程类似,分为如下七个阶段: 1.根据需求说明书编…

张小明 2025/12/30 6:34:16 网站建设

o2o网站开发方案福建厦门工程建设中心网站

在Python编程中,列表的append()方法是一个基础且高频使用的操作,用于在列表末尾添加新元素。它看似简单,却直接影响着代码的效率与可读性。许多开发者因其便利性而过度依赖,却忽略了其背后的原理和潜在的性能陷阱。理解append()的…

张小明 2025/12/30 11:25:15 网站建设