秒杀场景下MySQL的低效原因和改进

MySQL数据库表上做查询慢的原因及大流量场景下的应用技巧[图] 一、MySQL数据库表上做查询慢的原因 我们还分析了执行计划改写后的SQL,通过猜测,增加了hint来解决问题: 这一期,我们通过工具来分析一下:MySQL为什么会使用一个低效的执行计划,以致于我们不得已用hint来调优SQL? 实验 我们接着使用26问中的环境,使用optimizertrace工具,观察MySQL对SQL的优化处理过程。 我们先调大optimizertrace的内存容量(否则trace的输出会被截断),然后开启了optimizertrace功能。 跑完SQL后,可以在INFORMATION 阅读详情

在「中国数据库技术大会」上,淘宝分享了「秒杀场景下MySQL的低效」,详细分析了秒杀的技术难点及改进措施,简而言之,主要就是在高并发事务请求的情况下,数据库性能由于死锁检测等因素直线下降,在这种场景下,单纯的关闭死锁检测虽然可以提升一定的性能,但这顶多是治标而已,如何治本?


淘宝给出来两个改进方法

请求排队:如果请求一股脑的涌入数据库,势必会由于争抢资源造成性能下降,通过排队,让请求从混沌到有序,从而避免数据库在协调大量请求时过载。
请求合并:甲买了一个商品,乙也买了同一个商品,与其把甲乙当做当做单独的请求分别执行一次商品库存减一的操作,不如把他们合并后统一执行一次商品库存减二的操作,请求合并的越多,效率提升的就越大。


可惜的是淘宝的这些改进方法都是通过修改MySQL源代码在数据层实现的,对芸芸众生的我们而言,简直是一个无法逾越的技术门槛!那么是否可以在应用层实现呢?


请求排队
通过Redis实现队列是一件很简单的事情,使用LIST或者ZSET就可以搞定,如果没有优先级之类需求的话,通常LIST是一个更好的选择,因为它的时间复杂度更低,当然,如果处理队列的速度足够快,那么ZSET也不错。

把请求保存到队列里之后,可以通过Gearman实现Worker来消费队列,请求的生产和消费是异步的,所以不会出现并发拥堵,但是可能发生延迟,如果出现这种情况,可以通过增加Worker的数量可以加快消费队列的速度。

让我们从头捋捋:程序收到请求,然后把请求保存到Redis队列里,Gearman通过Worker处理队列里的请求,可是处理完之后如何通知程序呢?因为整个过程是异步的,所以除非程序支持某种形式的回调,否则很难通知。

最容易想到的解决办法是在程序里通过轮询来查询请求是否已经处理完成,但这无疑会增加数据库的负载,同时程序的实时性也会大打折扣。好在我们有其它的方法,比如说Redis提供了名为BLPOP和BRPOP的方法,它尝试从一个LIST里取元素,如果LIST为空则会堵塞连接,利用这个特性我们可以实现一个简易的通知功能:程序把请求保存到Redis队列里,然后调用BLPOP或BRPOP方法等通知,因为此时LIST为空,所以会堵塞连接,与此同时Gearman的Work处理完队列里的请求后,往LIST里保存一个状态码,程序感知到这个状态码,并通过状态码判断出请求是成功还是失败。

整个过程中有一些需要注意的地方,比如说因为BLPOP和BRPOP都属于堵塞性质的操作,所以一旦队列处理速度跟不上,程序就会堆积大量连接,这可能会引起很多连锁问题:一方面可能导致内存不足,以PHP为例,一个连接通常占用10M左右,堆积一千个连接的话,10G内存就没有了;另一方面大量的连接可能耗尽端口资源,具体取决于内核参数「net.ipv4.ip_local_port_range」。此时提高处理队列的速度是唯一的出路。


其实Gearman的Jobserver本身就实现了一个队列,而且还可以将这个队列用MYSQL来代替来持久化,保证队列请求不会丢失,客户端的请求先到Jobserver队列,然后Worker是真正的连接数据的程序,Jobserver根据Worker的闲忙将队列里的任务指派给Worker去处理,Worker连接数据是有限的,这样请求就不会一下拥入数据库。


请求合并

把类似的请求合并起来是一件既简单又复杂的事情,介于本文的标题是笨法玩秒杀,我们就挑简单的说,当我们通过Gearman的Work去处理队列里的请求时,通常是弹出一个请求处理一个请求,下面我们做出一些调整,每次不再只从队列里弹出一个请求,取而代之,我们一次性从队列里取出多个请求,然后在程序里完成合并后再执行。当然这里有很多细节问题,由于篇幅关系就不多说了。


高并发业务代码中一个事务中同时使用select和update的场景深度剖析 1.秒杀代码(最low实现): //开启事务 @Transactional(rollbackFor = Exception.class) public BaseResponse<?> startSeckillWithLock(Long id, Long userId) { try { return seckill(id, userId); } catch (Exception e) { throw 阅读详情

相关推荐

2013年中国数据库大会-28-秒杀场景下MySQL的低效--原因和改进

一年一度的中国数据库技术大会(DTCC)又将与大家见面了! 2013年4月18~4.20日,北京福朋喜来登酒店,第四届中国数据库技术大会将拉开序幕。 自2010年以来,国内领先的IT专业网站IT168联合旗下ITPUB、ChinaUnix技术社区已经连续举办了三届数据库技术大会,每届大会超过千人规模,云集了国内技术水平最高的数据架构师、DBA、数据库开发工程师、研发总监、IT经理等,是目前国内最受欢迎的数据库技术盛会。今年,大会将继续秉承分享IT最佳应用实践的宗旨,围绕大数据应用、数据架构、数据管理(数据治理)、传统数据库软件等技术领域展开深入探讨。 一直以来,数据库架构实践、数据库优化应用等,是备受大家关注的传统话题,本届大会仍将继续邀请一批国内顶尖的技术专家来进行分享,包括Oracle应用实践、MySQL应用实践、SQL Server应用实践等。

秒杀场景下mysql的低效_秒杀场景下MySQL的低效--原因和改进

tps(系统吞吐量,每秒事务处理量)总结请求排队:如果请求一股脑的涌入数据库,势必会由于争抢资源造成性能下降,通过排队,让请求从混沌到有序,从而避免数据库在协调大量请求时过载。请求合并:甲买了一个商品,乙也买了同一个商品,与其把甲乙当做当做单独的请求分别执行一次商品库存减一的操作,不如把他们合并后统一执行一次商品库存减二的操作,请求合并的越多,效率提升的就越大。秒杀优化优化1,更快速的序列化工具将...

weixin_39875754的博客 227

R语言新手也能搞定!WGCNA分析全流程代码详解(附常见报错解决方案)

本文为R语言新手提供了WGCNA分析的完整代码流程与实战指南。从环境配置、数据准备、软阈值选择、网络构建到模块-表型关联分析,逐步详解核心步骤。重点针对安装依赖、内存不足等常见报错提供了具体解决方案,帮助初学者避开陷阱,顺利完成加权基因共表达网络分析。

terraform7cloud的博客 539

聊聊秒杀活动实现——基于mall系统

商品下单流程,里卖弄有个核心的操作就是库存扣减,为了避免出现超买超卖现象,可以利用redis的单线程机制,利用Lua脚本,先去查验库存是否充足,如果充足进行扣减,失败的话当然订单也失败了,库存扣减成功后,进入到下单过程,避免和数据库操作,这里使用rabbitmq的削峰填谷,把订单发送到消息队列里面,在进行落库。实现思路:秒杀活动的痛点一般是要在高并发的环境下保持高性能,同时也要防止库存超买超卖的情况,而数据库很难保证在高并发环境下的稳定性,所以考虑使用一些高性能组件来实现Redis和Rabbitmq。

cocapan的博客 207

Android音频混音器AudioMixer实战:从多路输入到设备播放的完整流程解析

本文深入解析了Android平台上音频混音器AudioMixer的完整工作流程,涵盖从多路音频输入、轨道创建与配置、AudioBufferProvider数据源接入,到核心混音处理与最终设备播放的全过程。文章重点探讨了如何高效管理音频数据流、配置音量与重采样参数,并提供了缓冲区管理与性能优化的实战技巧,帮助开发者构建稳定、低延迟的音频应用。

l3m4n的博客 341

关于Nuttx操作系统

NuttX是一个成熟的实时操作系统

qq_28576837的博客 4091

秒杀系统面临哪些技术难题

秒杀系统需要考虑的问题

LiGuogang 1375

信息隐藏 数字图像空域隐写与分析技术的实现

【代码】信息隐藏 数字图像空域隐写与分析技术的实现。

Yungoal的博客 468

如何解决秒杀的性能问题和超卖的讨论

最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。 ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都懂了,等到自己出解决方案的时候发现还是有很多想不到的地方其实都没懂,再次验证了“细节是魔鬼”的理论。并且一个人的能力有限,只有大家一起讨论才能想的更周全,更细致。好了,闲话少说,下面进入正文。 一、秒杀带来了什...

weixin_33766168的博客 746

MT4-EA自动化交易研究笔记(2022-04-22)

自从接触到mt4的EA自动化交易,更让我这个10多年的老程序员看到了曙光,目前来看也确实出了一点成果,只是是否能稳定盈利有待时间的考验,所以开此专栏,一来做做记录与分析,更好的优化我的EA,二来也希望能与更多的高手交流,以完善我的交易系统

t35254056的博客 2290

[Vue][面试]谈谈你对MVC、MVP和MVVM的理解

谈谈你对MVC、MVP和MVVM的理解 答题思路:此题涉及知识点很多,很难说清楚,说透彻,因为MVC,MVP这些我们前端程序员自己甚至都没用过。但是恰恰反映了前端这些年从无到有, 从有到优的变迁过程,因此沿此思路回答将十分清除。 Web1.0时代 在web1.0时代,并没有前端的概念。开发一个web应用多数采用ASP.NET/Java/PHP编写,项目通常由多个aspx/jsp/php文件构成,每个文件中同时包含了HTML、CSS、JavaScript、C#/Java/PHP代码, 系统整体架构可能如下图所

你好,欢迎光临! 723

MYSQL秒杀的处理

一、秒杀带来了什么?  秒杀或抢购活动一般会经过【预约】【抢订单】【支付】这3个大环节,而其中【抢订单】这个环节是最考验业务提供方的抗压能力的。 抢订单环节一般会带来2个问题:   1、高并发   比较火热的秒杀在线人数都是10w起的,如此之高的在线人数对于网站架构从前到后都是一种考验。   2、超卖   任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品数量的上限,这

blacksoil55的博客 1243

SpringAi 通过大模型来实现调用自己的Api

摘要 本文介绍了如何利用Spring AI的Tools机制扩展大模型能力,实现业务系统集成。通过@Tool和@ToolParam注解定义工具方法,将订单查询和关闭功能暴露给大模型调用。关键实现包括:1)使用详细描述标注工具方法和参数;2)在ChatClient中注册工具服务;3)集成对话记忆保持上下文。该方法使AI具备操作业务系统的能力,形成"认知-决策-执行"闭环,大幅提升了模型在实际业务场景中的应用价值。

又要搬砖了 835

【转载】秒杀场景下MySQL的低效原因和改进以及Redis的处理

分享的PPT在如下网址: http://www.doc88.com/p-4199037770087.html 秒杀场景下mysql的低效原因和改进   另外有一个篇文章是针对以上内容的总结: http://blog.youkuaiyun.com/jiao_fuyou/article/details/15504777   淘宝给出来两个改进方法 请求排队:如果请求一股脑的涌入数据库,势必会由于争抢资源造成性能下...

weixin_34348805的博客 98

人工智能训练师三级补贴3120元申领全攻略|条件+流程+五省市对比

补贴是真的,但不是"白给"的。你需要满足社保、户籍、时间等条件,严格按照流程操作。记住四件事先确认自己是否满足条件,再报名——别考完了才发现领不到紧缺工种补贴更高——确认你所在城市是否在紧缺目录中证书下发后12个月内申请——设个日历提醒材料准备齐全再提交——避免来回折腾如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证到申领补贴的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1519

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

秒杀场景下MySQL的低效

最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。 ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都懂了,等到自己出解决方案的时候发现还是有很多想不到的地方其实都没懂,再次验证了“细节是魔鬼”的理论。并且一个人的能力有限,只有大家一起讨论才能想的更周全,更细致。好了,闲话少说,下面进入正文。   一、

skiof007的专栏 1929

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

秒杀场景下MySQL的低效(转)

秒杀场景下MySQL的低效 2016-01-14 17:12178人阅读评论(0)收藏举报 最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。 ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都懂了,等到自己出解决方案的时候发现还是有很多想不到的地方其实都没懂,再次验证了“细节是魔鬼”的...

weixin_30652271的博客 85

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

关于秒杀和超卖的性能问题

一、秒杀带来了什么?     秒杀或抢购活动一般会经过【预约】【抢订单】【支付】这3个大环节,而其中【抢订单】这个环节是最考验业务提供方的抗压能力的。 抢订单环节一般会带来2个问题:   1、高并发   比较火热的秒杀在线人数都是10w起的,如此之高的在线人数对于网站架构从前到后都是一种考验。   2、超卖   任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品

北岛知寒 1172

高并发秒杀系统实践

高并发场景 最近在慕课网上发现了一个高并发秒杀系统课程,学习了一下,对最后一章节里的场景分析和优化学习过程做了一个记录,分享一下,感觉这个老师讲的挺好的。 以一个秒杀场景为例,秒杀功能包括: 秒杀接口暴露(不到秒杀时间不允许用户访问) 执行秒杀 相关查询 高并发具体业务(秒杀)场景流程 红色部分可能会发生并发操作,绿色部分不会有并发操作 下面具体分析并发场景各个节点的优化 1.详情页 解决方案...

Jerry1ee 649
上一篇: 大数据处理之如何确保断电不丢数据
下一篇: 在学习技术的过程中就是要一步一个脚印,总有一天会豁然开朗,不知不觉的发现所有知识都串起来了,一件很神奇的事情
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值