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