串行、并行、并发

前提是给定多个任务
串行:这些多任务只能一个一个的执行,且一个执行完毕后,另一个才开始执行。
并行:这些多任务同时执行,且同一时刻都在分别执行,可以理解为多个CPU执行多个任务。
并发:多任务同时执行,但是同一时刻他只能执行一个任务。可以理解为一个CPU同时执行多个任务,但是他在多个任务间高速切换,达到同时执行的效果。

高并发:

指同一时刻/小小的时间段,大量的请求打到服务器上,超过了服务器能够承受的请求量。

服务器相关:

mysql数据库服务器,一般企业级分为16核32G、32核64G两种,一般服务器只能支持4000左右并发,好点的32核64G的服务器一般最高可以承受的并发在7000左右。所以就算是1W的并发,也足够瞬间打满mysql的服务器,就有可能打死服务器。
tomcat的服务器一般2核4G、4核8G,优化好一点的也只能支持700-1000的并发。
CDN服务器:内容分发服务器
负载均衡:简单理解为,通过不同的任务要求,最优的分配任务,达到高效的资源使用。
lvs:性能很强悍,一般可以抗下百万并发, 如果超过百万还可以通过lvs集群来处理。他是基于osi模型的tcp协议来操作,直接将请求在应用层之前就操作请求的报文,再负载均衡给下层。
nginx:相比tomcat一台只能抗住700-1000并发来说,nginx服务器一台能抗住5W的并发。他是基于应用层的服务器,可以通过lua表达式,直接再应用层对请求做出响应。

为什么mysql支持的并发数不高?

mysql是基于磁盘的数据库,根据引擎的不同,有不同的机制,比如添加索引,添加日志的等操作后,再去落盘。
1、完备的事务管理机制来确保安全性,事务提交、回滚等等都是很废性能的。
2、且在查询时会进行磁盘到内存的读取,这个io的过程也是很废时间和性能的。
3、复杂的表关系,多表查询时会大量的io不同的表。

Redis:

redis是一款C语言开发的高性能键值对数据库,也称为nosql数据库,是关系型数据库的补充。纯内存操作的非关系型数据库。
关系型数据库:二维表—有行有列(mysql)
非关系型数据库:基于键值对(redis)

为什么需要redis?

综上所诉,我们的系统必须讲究性能,而对mysql频繁的操作会大大的降低性能,索引需要加入这个redis。
redis可以理解为纯内存操作的数据库,不需要对磁盘访问,直接将数据放入内存中来操作。对于数据是否落盘,也是可以选择的,不同于mysql存的数据必须落盘。且redis基于内存,就不需要完整的事务管理系统。
这样就使得redis的性能很强悍,能承受的并发数大大提高,同服务器配置下的redis能承受的并发数是远远高于mysql的。

redis数据结构:

image.png
string:验证码使用,结构: key —value,key是 账号_时间,value是验证码
hash:存储对象,结构:key—field—value,
list(队列): 结构:key—value,value 是个list,排队,平台连麦,他会阻塞,一个一个得来,先进先出
set:结构:key—value,value 是个set,无序集合,
sorted set/zset:结构:key—value,value 是个set,有序集合,成员多个score,按score排序。用来做排行榜,大哥榜等等

高并发解决方法:

最简单的方法:
1、提高应用层性能,但是很有限
2、多搞几台服务器,但是太烧钱了
所以采用下面的方法。
一、首先错峰:
通过一些企业级验证码,将短时间的大量请求,分散到一个时间段,达到流量打散的目的。
再通过一些高防,来防止类似DDOS攻击,让走到后面的请求都是实实在在的真实请求。
二、层层负载均衡:
1、一般的读请求,将一些静态资源(js,css···)放到CDN服务器(内容分发)上。这样请求静态资源的时候不再去麻烦后面的服务器,直接反馈给用户。
2、写请求:
mysql服务器:将一些热点数据,不常改变的数据放到redis中,需要的时候先找redis,减少对数据库服务器的访问。
tomcat服务器:通过nginx去抗住大量流量。
流程:一般经过lvs+keep-alive来负载均衡给下一层(比如10W请求,合理拆分为两个5W给两台nginx服务器),下一层web层使用Nginx服务器。nginx配合lua表达式去做一些高阶的操作,在应用层直接从缓存(redis)中拿去数据来对请求做出响应,就可以不通过后台服务器完成一些请求的处理。
3、限流
通过者一系列的层层筛选操作后,还是需要访问后台数据库服务器的话,nginx再去限流,有一个令牌桶算法。
3.1:整体限流:将流量限制到后台能承受的流量。比如总共10W请求,后台只能承受1W,那么nginx只放行1W。
3.2:业务限流:根据业务情况,放行后台最多需要的请求。比如秒杀5000个商品,只放行110%-120%请求。将业务包裹后发给mq,mq进行消峰排队,然后让后台服务器慢慢操作。