SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。

学习课程的地址:https://www.imooc.com/learn/632

老师的GitHub地址:https://github.com/geekyijun/seckill

高并发发生在哪里?
分析整个系统流程,用户进行秒杀时最感兴趣的进入详情页进行秒杀。图中红色表示可能会出现高并发的点,绿色表示不会出现高并发。

为什么要单独获取系统时间?
用户进行大量刷新时,详情页会部署到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:https://github.com/geekyijun/seckill),理解原理就好。需要用到高并发时候可以详细学习一下。大致的思路就是访问redis缓存有没有数据,有就直接读,没有再读数据库并更新redis缓存。一致性通过设置一段时间后redis失效(超时穿透)和更新数据库时同时更新redis缓存(主动更新)。

秒杀操作—并发优化
将update减库存和insert购买明细进行顺序调整,将减少行级锁的时间,不必担心insert的问题,因为减库存成功后才commit否则rollback。但是这么做减少一半的网络延时和GC时间。关注点在哪些事务的操作中对数据库的行级锁有竞争关系,将行级锁的更新压缩到最小。

深度优化:将逻辑判断直接以函数的形式写入MySQL。

-- 存储过程

-- 1:存储过程优化:事务行级锁持有的时间

-- 2:不要过度依赖存储过程(一般存在于银行,互联网公司很少使用,秒杀单有用的地方)

-- 3:简单的逻辑可以应用存储过程

-- 4:QPS:一个秒杀单6000/qps

GitHub上有这一段的源码。

系统的部署架构

讲解了关于高并发下秒杀的简单案例(当然现实比这个复杂的多),感谢大牛。

原文地址

SSM(Spring+SpringMVC+MyBatis)高并发优化思路的更多相关文章

  1. Spring+SpringMVC+MyBatis+easyUI整合优化篇(二)Log4j讲解与整合

    日常啰嗦 上一篇文章主要讲述了一下syso和Log间的一些区别与比较,重点是在项目的日志功能上,因此,承接前文<Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)Sy ...

  2. SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)

    1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee.com/niceyoo/jeenotes-ssm 2. 概述 在写代码之前我们先了解一下 ...

  3. Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试>讲了不为和不能两个状态,针对不为,只能自己调整心态了,而对于不能,本文会结合一 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试

    日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...

  5. Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合>讲了富文本编辑器UEditor的整合与使用 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化

    本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...

  7. SSM Spring+SpringMVC+mybatis+maven+mysql环境搭建

    SSM Spring+SpringMVC+mybatis+maven环境搭建 1.首先右键点击项目区空白处,选择new->other..在弹出框中输入maven,选择Maven Project. ...

  8. Spring+SpringMVC+MyBatis+easyUI整合优化篇

    优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log Spring+SpringMVC+MyBatis+easyUI整合优化篇 ...

  9. SSM(Spring + Springmvc + Mybatis)框架面试题

    JAVA SSM框架基础面试题https://blog.csdn.net/qq_39031310/article/details/83050192 SSM(Spring + Springmvc + M ...

  10. SSM(Spring +SpringMVC + Mybatis)框架搭建

    SSM(Spring +SpringMVC + Mybatis)框架的搭建 最近通过学习别人博客发表的SSM搭建Demo,尝试去搭建一个简单的SSMDemo---实现的功能是对用户增删改查的操作 参考 ...

随机推荐

  1. Nginx之核心结构体ngx_cycle_t

    1. ngx_listening_t 结构体 ngx_cycle_t 对象中有一个动态数组成员叫做 listening,它的每个数组元素都是 ngx_listening_t 结构体,而每个 ngx_l ...

  2. 【软件工程】Beta冲刺(5/5)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 将数据分析以可视化形式展示出来 新增数据分析展示等功能API 服务器后端部署, ...

  3. linux 下安装redis并用QT写客户端程序进行连接

      1.安装redis.使用如下命令: wget http://dowload.redis.io/redis-stable.tar.gz tar xzf redis-stable.tar.gz cd ...

  4. pm2 常用配置项解析

    1.解析 1. apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用 2. name:应用程序名称"app" 3. cwd:应用程序所在的目录& ...

  5. 前端知识点回顾之重点篇——CORS

    CORS(cross origin resource sharing)跨域资源共享 来源:http://www.ruanyifeng.com/blog/2016/04/cors.html 它允许浏览器 ...

  6. win10下检查nvidia显卡支持的cuda版本

    1.首先将[C:\Program Files\NVIDIA Corporation\NVSMI]添加至系统环境变量[path]中: 2.在powershell中使用命令[nvidia-smi],即可看 ...

  7. 使用Python爬取mobi格式电纸书

    最近做了个微信推送kindle电子书的公众号:kindle免费书库 不过目前电子书不算非常多,所以需要使用爬虫来获取足够书籍. 于是,写了以下这个爬虫,来爬取kindle114的电子书. 值得注意的地 ...

  8. SSM批量添加数据

    如何应对面临批量数据时如何提交给后台 方式1: 使用JSON格式 后台功能接受实现使用@ResponseBody 前端当有多行数据的时候添加到一个数组再通过JSON格式到后台List接收 @Reque ...

  9. python matlab 带包实现全排列

    >> A=[2,5,7];perms(A) ans = 7 5 2 7 2 5 5 7 2 5 2 7 2 7 5 2 5 7 >> perms(1:4) ans = 4 3 ...

  10. 在Python中使用lambda高效操作列表的教程

    在Python中使用lambda高效操作列表的教程 这篇文章主要介绍了在Python中使用lambda高效操作列表的教程,结合了包括map.filter.reduce.sorted等函数,需要的朋友可 ...