文章插图
一:问题首先我们要考虑的是为什么要解决高并发,高并发瓶颈出现在哪里,有了解过的朋友肯定知道是在数据库,因为在大量请求去操作数据库时会出现数据的错乱,超卖,系统崩溃,MySQL死锁等现象 。
文章插图
二:思路
- 1. 页面静态化:就是将整个页面存储到redis中,下次访问时去读取redis中的页面值
- 2. cdn:主要对整个网站的静态资源文件进行加速,如图片,css,js等(去阿里看教程)
- 3.数学验证码:用户在计算验证码结果时可以减少大量请求同时进入,减少redis, mysql,服务器的压力 。
- 4:库存标识:这是一个巨大优化,通过标识来判断redis的库存是否足够,如不足就中断去读取redis库存 。例:boolean over = map.get(goodsId);当我们map通过key读取到value值为true的时候,就返回错误提示给用户,if(over) { return Result.error(‘库存不足’); }.....这样不管以后有多个请求进入都只运行两行代码,以下的操作无法进入 。
- 5.生成动态url:主要是防止恶意用户通过固定url进行提前秒杀商品(安全方面问题这个不可掉以轻心,你连安全措施都没做好以下的那些操作都是白搭的)
- 6. redis预减库存:在用户秒杀商品前去redis获取当前的库存数量,然后在秒杀时候直接减去redis存储的库存(大家放心这里Redis和MySQL数据是同步的,只要进入MQ队列操作完成下单,MySQL数据库会-1数量),从而避开去MySQL读取库存数据 。
- 7. MQ消息队列:它是一个中间消息键,通过生产者发送消息给消费者,进行业务操作,而生产者无需知道执行结果,也就是用户点击秒杀之后等待处理结果,之后再去轮询查询处理结果(异步操作),这样就避开了不断请求去操作数据库 。(这里的轮询查询也是直接从redis里面去查询,因为秒杀成功之后会将秒杀的结果放到redis中,轮询时候通过key去查询)
- 8. Nginx:解决高并发的好方法,也就是我们多增加几个Tomcat服务器 。当用户访问的时候,请求可以提交到空闲的tomcat服务器上 。
- 9.数据库集群、库表散列
②在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可 。
③上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案 。
【Java解决高并发秒杀】④我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性 。
- 10.负载均衡
- 11.反向代理
代理服务器和反向代理服务器:
代理服务器是代我们访获取资源,然后将结果返回 。例如,访问外网的代理服务器 。反向代理服务器是我们正常访问一台服务器的时候,服务器自己调用了别的服务器 。
反向代理就是说,用户的请求请求到负载均衡的设备上,负载均衡设备再讲请求分发到空闲的应用服务器上处理,处理完成之后再通过负载均衡设备返回给用户,这样对于用户来说,后来的分发是不可见的 。
文章插图
反向代理的实现
1)需要有一个负载均衡设备来分发用户请求,将用户请求分发到空闲的服务器上
2)服务器返回自己的服务到负载均衡设备
3)负载均衡将服务器的服务返回用户
代理服务器我们主动使用,是为我们服务的,不需要有自己的域名;反向代理是服务器自己使用的,我们并不知道,有自己的域名 。
推荐阅读
- Java正确获取客户端真实IP方法整理——附教程
- Java语言 面试中八大常见排序算法
- JavaScript 表单验证如何实现的?
- 网站文章不被收录该怎么解决
- javascript简单的正则表达式应用
- Java代码获取数据库表名、字段名、字段类型及注释等信息
- 手机连不上网?四种方法教你如何解决,建议收藏以备不时之需
- JavaScript 究竟是如何工作的?
- 春季皮肤干燥怎么办 春季皮肤干燥解决方法
- 该如何解决就业、求职问题 如何解决就业问题