为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
MySQL

https://img1.sycdn.imooc.com//5bd6d79e0001125705580259.jpg

https://img1.sycdn.imooc.com//5bd6d7b200013f1305580286.jpg

https://img1.sycdn.imooc.com//5bd6d7ba00013ab005580419.jpg

https://img1.sycdn.imooc.com//5bd6d7ca0001dca005580400.jpg

tps(系统吞吐量,每秒事务处理量)

https://img1.sycdn.imooc.com//5bd6d7e90001286e05580292.jpg

https://img1.sycdn.imooc.com//5bd6d8060001741405580413.jpg

https://img1.sycdn.imooc.com//5bd6d812000160aa05580301.jpg

https://img1.sycdn.imooc.com//5bd6d81a0001219105580392.jpg

https://img1.sycdn.imooc.com//5bd6d829000136ad05580368.jpg

https://img1.sycdn.imooc.com//5bd6d82f0001d32505580381.jpg

https://img1.sycdn.imooc.com//5bd6d8370001c96905580408.jpg

https://img1.sycdn.imooc.com//5bd6d83c000154e905580210.jpg

https://img1.sycdn.imooc.com//5bd6d84800014a9905580377.jpghttps://img1.sycdn.imooc.com//5bd6d84c00012ca705580394.jpg

https://img1.sycdn.imooc.com//5bd6d854000175c605580240.jpg

总结

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

秒杀优化

优化1,更快速的序列化工具

将秒杀信息用redis缓存起来,redis并没有实现内部序列化,所以存对象需要实现序列化

如果使用默认类实现jdk的serializable 效率比较低 所以我们要选写高性能的序列化工具

https://github.com/eishay/jvm-serializers/wiki (这个是对Java 序列化技术做了比对)

https://img1.sycdn.imooc.com//5bd6d87c00018a2605580301.jpg

用protostuff 首先引入两个包

https://img1.sycdn.imooc.com//5bd6d88900018ba708170310.jpg

https://img1.sycdn.imooc.com//5bd6d88f000124db05580276.jpg

https://img1.sycdn.imooc.com//5bd6d894000110f805580284.jpg

https://img1.sycdn.imooc.com//5bd6d8980001fdd805580233.jpg

优化2, 防重优化

https://img1.sycdn.imooc.com//5bd6d8a20001af3e06270468.jpg

优化

insert 用订单和用户电话号做唯一主键,可以防重

https://img1.sycdn.imooc.com//5bd6d8bc0001164305580236.jpg

https://img1.sycdn.imooc.com//5bd6d8c00001b52d05580077.jpg

优化3, 利用存储过程优化

我们知道 mysql 在执行本地主键sql 非常快 可以达到(4万/秒 的qps) Java执行代码也非常快,所以减库存的瓶颈主要出现在网络延迟和 GC的暂停(stop the word)

  减少网路连接我们可以使用存储过程

https://img1.sycdn.imooc.com//5bd6d8d00001dfce05580272.jpg

https://img1.sycdn.imooc.com//5bd6d8d50001a56e05580147.jpg

https://img1.sycdn.imooc.com//5bd6d8da0001324505580284.jpg

https://img1.sycdn.imooc.com//5bd6d8df0001ac0305580143.jpg

在Java代码中调用存储过程

配置mapper 利用mybatis 调用存储过程是一个select

https://img1.sycdn.imooc.com//5bd6d8e80001f47d08370206.jpg

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消