SSM(Spring+SpringMVC+MyBatis)⾼并发优化思路
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合⽽成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项⽬的框架。
学习课程的地址:
⽼师的GitHub地址:
⾼并发发⽣在哪⾥?
分析整个系统流程,⽤户进⾏秒杀时最感兴趣的进⼊详情页进⾏秒杀。图中红⾊表⽰可能会出现⾼并发的点,绿⾊表⽰不会出现⾼并发。
为什么要单独获取系统时间?
⽤户进⾏⼤量刷新时,详情页会部署到CDN节点上,进⾏静态化处理同时包括静态资源(css/js等)。这样就难以获得系统的统⼀秒杀时间。
CDN(内容分发⽹络)加速⽤户获取数据的系统,部署在离⽤户最近的⽹络节点上,命中CDN不需要访问后端服务器,互联⽹公司⼀般⾃⼰搭建或租⽤CDN服务器。涉及到CDN知识,进公司后涉及到⾃然就会了。。。
获取系统时间不⽤进⾏优化,因为访问内存的速度相当快。
秒杀地址接⼝分析
⽆法使⽤CDN,使⽤CDN⼀般是不便的资源,⽽这⾥返回秒杀地址是变化的。适合使⽤服务端缓存如redis等。
流程则是先访问redis,如果redis中没有再去数据库中寻,即redis是数据库的⼀个映射(后⾯得学下redis。。。),这⾥涉及到⼀致性问题,使⽤超时穿透/主动更新的⽅法。
秒杀操作的优化分析
⽆法使⽤CDN,库存量缓存困难,⼀⾏数据竞争(热点商品)。
为什么说MySQL低效?测试⾥MySQL的⼀条update⼀秒钟可以进⾏4W多次,不算低。主要是因为⾏级锁,每个⽤户都进⾏update,进⾏事务操作,等待锁的过程变成了串⾏化的操作。⾏级锁是在commit之后释放,优化的⽅向则是如何减少⾏级锁的持有时间。
延迟的分析:物理上的距离、JVM的GC问题。将客户端运⾏在MySQL端。⽅案⼀:定制SQL⽅案,需要修改MySQL源码。⽅案⼆:使⽤存储过程,整个事务在MySQL端完成。(这⼀段需要查更多资料)。
总结
前端控制:暴露接⼝、按钮防重复
动静态数据分离:CDN缓存、后端缓存
事务竞争优化:减少事务锁时间
redis后端缓存优化
redis⽬前官⽹不⽀持Windows,不过微软做了⼀个win64的版本。
具体编码这⾥不贴出了(见GitHub:github/geekyijun/seckill),理解原理就好。需要⽤到⾼并发时候可以详细学习⼀下。⼤致的思路就是访问redis缓存有没有数据,有就直接读,没有再读数据库并更新redis缓存。⼀致性通过设置⼀段时间后redis失效(超时穿透)和更新数据库时同时更新redis缓存(主动更新)。
秒杀操作—并发优化
将update减库存和insert购买明细进⾏顺序调整,将减少⾏级锁的时间,不必担⼼insert的问题,因为减库存成功后才commit否则rollback。但是这么做减少⼀半的⽹络延时和GC时间。关注点在哪些事务的操作中对数据库的⾏级锁有竞争关系,将⾏级锁的更新压缩到最⼩。
深度优化:将逻辑判断直接以函数的形式写⼊MySQL。
-- 存储过程
-- 1:存储过程优化:事务⾏级锁持有的时间
-- 2:不要过度依赖存储过程(⼀般存在于银⾏,互联⽹公司很少使⽤,秒杀单有⽤的地⽅)-- 3:简单的逻辑可以应⽤存储过程
-- 4:QPS:⼀个秒杀单6000/qps
GitHub上有这⼀段的源码。
系统的部署架构
mybatis和springmvc讲解了关于⾼并发下秒杀的简单案例(当然现实⽐这个复杂的多),感谢⼤⽜。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论