作用:分割、查找、匹配、替换字符串
分割符:正斜线(/)、hash符号(#)以及取反符号(~)
通用原子:
\d: 匹配一个数字字符。等价于 [0-9]。
\D: 匹配一个非数字字符。等价于 [^0-9]。
\w: 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W: 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\s: 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S: 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
元字符:
. : 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。
* : 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
? : 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does"
$ : 匹配输入字符串的结束位置
+ : 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} : n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}: n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}: m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
[] () [^] | [-]
中文匹配:UTF-8汉字编码的范围是0x4e00-0x9fa5,在ANSI(gb2312)环境下,0xb0-0xf7,0xa1-0xfe
正则表达式PCRE函数:preg_match()、preg_match_all()、preg_replace()、preg_split()
__construct() 构造方法
__destruct() 析构方法
__call() 在对象中调用一个不可访问或者不存在的方法时,__call() 会被调用
__callStatic() 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用
__get() 读取不可访问属性的值时,__get() 会被调用
__set() 在给不可访问属性赋值时,__set() 会被调用
__isset() 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用
__unset() 当对不可访问属性调用 unset() 时,__unset() 会被调用
__toString() echo输出一个对象会调用
__clone() 克隆一个对象
常见状态码:200 204 206 301 302 303 304 307 400 401 403 404 500 503的含义
OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
物理层:建立、维护、断开物理连接
数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能
网络层:进行逻辑地址寻址,实现不同网络之间的路径选择
传输层:定义传输数据的协议端口号,以及流控和差错校验,协议有TCP UDP,数据包一旦离开网卡即进入网络传输层
会话层:建立、管理、终止会话
表示层:数据的表示、安全、压缩
应用层:网络服务与最终用户的一个接口,协议有:HTTP FTP TFTP SMTP SNMP DNS HTTPS POP3 DHCP
HTTP请求有三部分组成:请求行、消息报文、请求正文。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议版本
如:Method Request-URI HTTP-Version CRUF
Method:请求方法
Request-URI:一个统一资源标识符
HTTP-Version:请求的HTTP协议版本
CRLF:回车和换行
HTTP响应由状态行、消息报文、响应正文组成
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version:服务器http协议版本
Status-Code :服务器返回的响应状态码
Reason-Phrase:状态代码的文本描述
HTTP协议的工作特点和工作原理
工作特点:基于B/S模式,通信开销小、简单快速、传输成本低,使用灵活、可使用超文本传输协议,节省传输时间,无状态
工作原理:客户端发送请求给服务器,创建一个TCP连接,指定端口号,默认80,连接到服务器,服务器监听浏览器请求,一旦监听到客户端请求,分析请求类型后,服务器向客户端返回状态信息和数据内容
HTTP协议常见请求/响应头
Content-Type、Accept、Origin、Cookie、Cache-Control、User-Agent、Referrer、X-Forwarded-For、Access-Control-Allow-Origin、Last-Modified
Host: 请求资源的主机和端口号
User Agent: 发出请求的用户信息,辨别客户端所用设备的重要依据
Accept: 告诉服务器可以接受的文件格式
Cache Control:指定请求和响应遵循的缓存机制
Referer: 头域允许客户端指定请求URL的资源地址
Content Length:内容长度
Content Range:响应资源范围
Content Encoding:指定所能接收的编码方式
HTTP协议常见请求/响应头
Content-Type、Accept、Origin、Cookie、Cache-Control、User-Agent、Referrer、X-Forwarded-For、Access-Control-Allow-Origin、Last-Modified
HTTP协议的请求方法
GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE
HTTPS的工作原理
HTTPS是一种基于SSL/TLS的HTTP协议,所有的HTTP数据都是在SSL/TLS协议封装之上传输的。
HTTPS协议在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议
常见网络协议含义及端口
FTP、Telnet、SMTP、POP3、HTTP、DNS
InnoDB表引擎
默认事务型引擎,最重要最广泛的存储引擎,性能非常优秀。数据存储在共享表空间,可以通过配置分开。对主键查询的性能高于其他类型的存储引擎。内部做了很多优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区
通过一些机制和工具支持真正的热备份,支持崩溃后的安全恢复,支持行级锁,支持外键
MyISAM表引擎
5.1版本前,MyISAM是默认的存储引擎,拥有全文索引、压缩、空间函数。不支持事务和行级锁,不支持奔溃后的安全恢复。表存储在两个文件,MYD和MYI。设计简单,某些场景下性能很好
其他的表引擎
Archive、Blackhole、CVS、Memory
索引对性能的影响
大大减少服务器需要扫描的数据量,帮助服务器避免排序和临时表、将随机I/O变顺序I/O,大大提高查询速度,降低写的速度、占用磁盘
索引的使用场景
对于非常小的表,大部分情况下全表扫描效率更高。中到大型表,索引非常有效。特大型的表,建立和使用索引的代价随之增长,可以使用分区技术来解决
索引的类型
普通索引:最基本的索引,没有任何约束限制
唯一索引:与普通索引类似,但是具有唯一性约束
主键索引:特殊的唯一索引,不允许有空值
组合索引:将多个列组合在一起创建索引,可以覆盖多个列
外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作
全文索引:MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文索引
一个表只能有一个主键索引,可以有多个唯一索引。主键索引一定是唯一索引,唯一索引不是主键索引。主键可以与外键构成参照完整性约束,防止数据不一致
MySQL索引的创建原则
1、最适合索引的列是在where子句中的列,或连接子句中的列而不是出现在select关键字后的列
2、索引列的基数越大。索引的效果越好
3、对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间
4、根据情况创建复合索引,复合索引可以提高查询效率
5、避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率
6、主键尽可能选择短的数据类型,可以有效减少索引的磁盘占用提高查询效率
MySQL索引的注意事项
1、复合索引遵循前缀原则
2、like查询。%不能在前,可以使用全文索引
3、column is null可以使用索引
4、如果MySQL估计使用索引比全表扫描更慢,会放弃使用索引
5、如果or前的条件中的列有索引,后面的没有,索引都不会被用到
6、列类型是字符串,查询时一定要给值加引号,否则索引失效
查找分析SQL查询慢的原因
1、记录慢查询日志:分析查询日志,不要直接打开查询日志进行分析,这样比较浪费时间和精力,可以使用pt-query-digest工具进行分析
2、使用show profile: set profiling=1;开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中(show profiles;show profiles for query 临时表ID)
3、使用show status: show status 会返回一些计数器,show global status 查看服务器级别的所有计数;有时根据这些计数,可以猜测出哪些操作代价较高或者消耗时间多
4、使用show processlist 观察是否有大量线程处于不正常的状态
5、使用explain:分析单条SQL语句
优化查询过程中的数据访问
访问数据太多导致查询性能下降
1、确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
2、确认MYSQL服务器是否在分析大量不必要的数据行
避免使用如下SQL语句
1、查询不需要额记录,使用limit解决
2、多表关联返回全部列,指定A.id,B.age
3、总是取出全部列,SELECT * 会让优化器无法完成索引覆盖扫描的优化
是否在扫描额外的记录
使用explain来进行,如果发现查询需要扫描大量数据但只返回少数的行,可以通过如下技巧去优化:使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果
改变数据库和表的结构,修改数据表范式(冗余)。重写SQL语句,让优化器可以以更优的方式执行查询
优化长难的查询语句
1、一个复杂查询还是多个简单查询
MYSQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多
使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询时很有必要的
2、切分查询
将一个大的查询分为多个小的相同的查询
一次性删除1000万的数据要比一次删除一万,暂停一会的方案更加耗损服务器开销
3、分解关联查询
可以将一条关联语句分解成多条SQL来执行,让缓存的效率更高,执行单个查询可以减少锁的竞争,在应用层做关联可以更容易对数据库进行拆分
优化特定类型的查询语句
优化count()查询
count( * )中*会忽略所有的列,直接统计所有列数,因此不要使用count(列名)
MyISAM中,没有任何where条件的count( * )非常快
当有where条件,MyISAM的count统计不一定比其他表引擎快
优化关联查询
确定on或者using子语句的列上有索引
确保group by和order by中只有一个表中的列,这样MySQL才有可能使用索引
优化group by 和distinct
这两种查询均可使用索引来优化,是最有效的优化方法
关联查询中,使用标识列进行分组的效率会更高
如果不需要order by,进行group by时使用order by null,MySQL不会再进行文件排序
分区表的原理
工作原理:对用户而言,分区表是一个独立的逻辑表,但是底层MySQL将其分成了多个物理子表,这对用户来说是透明的,每一个分区表都会使用一个独立的表文件。
创建表时使用partition by子句定义每个分区存放的数据,执行查询时,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询只需要所需数据在的分区即可
分区的主要目的是将数据按照一个较粗的粒度分在不同的表中,这样可以将相关的数据存放在一起,而且如果想一次性删除整个分区的数据也很方便
适用场景
1、表非常大,无法全部存在内存或者只在表最后有热点数据,其他都是历史数据
2、分区表的数据更易维护,可以对独立的分区进行独立的操作
3、分区表的数据可以再不同的机器上,从而高效适用资源
4、可以使用分区表来避免某些特殊的瓶颈
5、可以备份和恢复独立的分区
限制
1、一个表最多只能有1024个分区
2、5.1版本中,分区表表达式必须是整数,5.5可以使用列分区
3、分区字段中如果有主键和唯一索引列,那么主键列和唯一列都必须包含进来
4、分区表中无法使用外键约束
5、需要对现有表的结构进行修改
6、所有分区都必须使用相同的存储引擎
7、分区函数中可以使用的函数和表达式会有一些限制
8、某些存储引擎不支持分区
9、对于MyISAM的分区表,不能使用load index into cache
10、对于MyISAM表,使用分区表时需要打开更多的文件描述
水平分表缺点
1、给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需union操作
2、在许多数据库应用中,这种复杂性会超过它带来的优点,查询时会增加读一个索引层的磁盘次数
使用场景
1.如果一个表中某些列常用,而另外一些列不常用
2.可以使数据行变小,一个数据页能存储更多数据,查询时减少I/O次数
SQL查询的安全方案
1、使用预处理语句防SQL注入
2、写入数据库的数据要进行特殊字符的转义
3、查询错误信息不要返回给用户,将错误记录到日志
MySQL的其他安全设置
1、定期做数据备份
2、不给查询用户root权限,合理分配权限
3、关闭远程访问数据库权限
4、修改root口令,不用默认口令,使用较复杂的口令
5、删除多余的用户
6、改变root用户的名称
7、限制一般用户浏览其他库
8、限制用户对数据文件的访问权限
工作原理:用一个处理程序文件处理所有的HTTP请求,根据请求时的参数的不同区分不同模块和操作的请求
优势:可以进行统一的安全性检查,集中处理程序
劣势:URL不美观,处理效率会稍低
常见模板引擎
PHP是一种HTML内嵌式的在服务端执行的脚本语言,但是PHP有很多可以使PHP代码和HTML代码分开的模板引擎:Smary、Twig、Haml、Liquid等
模板引擎的工作原理:庞大的完善的正则表达式替换库
PHP框架的差异和优缺点
Yaf框架
Yaf使用PHP扩展的形式写的一个PHP框架,也就是以C语言为底层编写的,性能上要比PHP代码写的框架要快一个数量级
优点:执行效率高、轻量级框架、可扩展性强
缺点:高版本兼容性差,底层代码可读性差,需要安装扩展、功能单一,开发需要编写大量的插件
Yii2框架
Yii2是一款非常优秀的通用Web后端框架,结构简单优雅、实用功能丰富、扩展性强、性能高是它最突出的优点。
缺点:学习成本高
时间复杂度和空间复杂度
时间复杂度:执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度就是T(n)=O(f(n))。问题的规模n越大,算法执行的时间的增长率f(n)的增长率正相关,称作渐进时间复杂度。
时间复杂度的计算方式:得出算法的计算次数公式;用常数1来取代所有时间中的所有加法常数;在修改后的运行次数函数中,只保留最高阶项;如果最高阶存在且不是1,则去除与这个项相乘的常数。
常见时间复杂度:常数阶、线性阶、平方阶、立方阶、对数阶、nlog2n阶、指数阶
O(1)>O(log2n)>O(n)>O(nlog2n)>O(n^2)>O(n^3)>O(2^n)>O(n!)>O(n^n)
空间复杂度
算法需要消耗的内存空间,记作:S(n)=O(f(n))
包括程序代码所占用的空间,输入数据所占用的空间和辅助变量所占的空间这三方面
计算和表示方法和时间复杂度类似,一般用复杂度的渐进性来表示
冒泡排序、直接插入排序、希尔排序、选择排序、快速排序、堆排序、归并排序
冒泡排序:两两相邻的数进行比较,如果反序就交换,否则不交换
时间复杂度:最坏(O(n^2)),平均(O(n^2))
空间复杂度:O(1)
直接插入排序
原理:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序
时间复杂度:最坏(O(n^2)),平均(O(n^2))
空间复杂度:O(1)
希尔排序
原理:把待排序的数据根据增量分成几个序列,对子序列进行插入排序,直至增量为1,直接进行插入排序;增量的排序,一般是数组的长度的一半,再变为原来增量的一半,直到增量为1
时间复杂度:最差(O(n^2)),平均(O(n*log2n))
空间复杂度:O(1)
选择排序
原理:每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
时间复杂度:最坏(O(n^2)),平均(O(n^2))
空间复杂度:O(1)
快速排序
原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归完成
时间复杂度:最差(O(n^2)),平均(O(nlog2n))
堆排序
原理:把待排序的元素按照大小在二叉树位置上排序,排序好的元素要满足:父节点的元素要大于等于子节点;这个过程叫做堆化过程,如果根节点存放的是最大的数,则叫做大根堆,如果是最小,就叫小根堆,可以把根节点拿出来,然后再堆化,循环到最后一个节点
时间复杂度:最差(O(nlog2n)),平均(O(nlog2n))
空间复杂度:O(1)
归并排序:
原理:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列
时间复杂度:最差(O(nlog2n)),平均(O(nlog2n))
空间复杂度:O(n)
总结:快速排序、归并排序的理想时间复杂度都是O(nlog2n),但是快速排序的时间复杂度并不稳定,最坏情况下复杂度为O(n^2),所以最理想的算法还是归并排序
二分查找
原理:从数组的中间元素开始,如果中间元素正好是要查找的元素,搜索结束,如果某一个特定元素大于或小于中间元素,则在数组大于或者小于中间元素的那一半中查找,而且跟开始一样从中间开始比较,如果某一步骤数组为空,代表找不到
时间复杂度:最差(O(log2n)),平均(O(log2n))
空间复杂度:迭代(O(1))、递归(O(log2n))
顺序查找
原理:按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止
时间复杂度:最差(O(n)),平均(O(n))
空间复杂度:O(1)
总结:二分查找算法的时间复杂度最差是O(log2n),顺序查找的时间复杂度最差为O(n),所以二分查找法更快,但是在递归情况下,二分查找法更消耗内存,时间复杂度为O(log2n)
LinkedList
链表,线性表的一种,最基本、最简单常用的数据结构
特性:元素之间的关系是一对一的关系(除了第一个和最后一个元素,其他元素都是首尾相接)、顺序存储结构和链式存储结构两种存储方式
Stack
栈,和队列相似,一个带有数据存储特性的数据结构
特性:存储数据时先进后出的、栈只有一个出口,只能从栈顶增加和移除元素
Heap
堆,一般情况下,堆叫二叉堆,近似完全二叉树的数据结构
特性:子节点的键值或者索引总是小于它的父节点、每个节点的左右子树又是一个二叉树、根节点最大的堆叫最打堆或者大根堆,最小的叫最小堆或者小根堆
List
线性表,由零个或多个数据元素组成的有序序列
特性:线性表时一个序列;0个元素构成的线性表是空;、第一个元素无先驱、最后一个元素无后继、其他元素都只有一个先驱和后续、有长度,长度是元素个数,长度有限
doubly-linked-list 双向列表
特性:每个元素都是一个对象,每个对象有一个关键字key和两个指针(next和prev)
queue 队列
特性:先进先出、并发中使用、可以安全将对象从一个任务传给另一个任务
QPS:每分钟请求或者查询的数量,在互联网领域,指每秒响应请求数(HTTP请求)
吞吐量:单位时间内处理的请求数量(通常由QPS与并发数决定)
PV:综合浏览量,即页面浏览量或者点击量,一个访客在24小时内访问的页面数量(同一人访问网站同一页面,只做一次PV)
UV:独立访客,即一定时间范围内相同访客多次访问网站,只计算为一个独立访客
带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小
日网站带宽 = PV / 统计时间(秒) * 平均页面大小(KB) * 8
QPS不等于并发连接数,QPS是每秒HTTP请求数量,并发连接数是系统同时处理的请求数量
(总PV * 80%) / (6小时秒数 * 20%) = 峰值每秒请求数(QPS)
80%的访问量集中在20%的时间
高并发的问题应该关心:压力测试,测试能承受的最大并发、测试最大承受的QPS值
常用性能测试工具
ab、wrk、http_load、Web Bench、Siege、Apache JMeter
ab的使用:
模拟并发请求100次,总共请求5000次
ab -c 100 -n 5000 www.baidu.com
高并发注意事项
1、测试机器与被测试机器分开
2、不要对线上服务做压力测试
3、观察测试工具ab所在机器,以及被测试的前端机的cpu,内存,网络等都不超过最高限度的75%
QPS达到50:可以称之为小型网站,一般的服务器就可以应付
QPS达到100:假设关系型数据库的每次请求在0.01秒完成,单页面只有一个SQL查询,那么100QPS意味着1秒钟完成100次请求,但是此时我们并不能保证数据库查询能完成100次
方案:数据库缓存层、数据库的负载均衡
QPS达到800:假设使用百兆带宽,意味着网站出口的实际带宽是8M左右,每个页面只有10K,在这个并发条件下,百兆带宽已经用完
方案:CDN加速、负载均衡
QPS达到1000:假设使用Memcache缓存数据库查询数据,每个页面对Memcachae的请求远大于直接对DB的请求,Memecache的悲观请求数在2W左右,但有可能之前的内网带宽已经吃光,表现不稳定
方案:静态HTML缓存
QPS达到2000,方案:做业务分离,分布式存储
高并发解决方案案例
流量优化:防盗链处理
前端优化:减少HTTP请求、添加异步请求、启用浏览器缓存和文件压缩、CDN加速、建立独立的图片服务器
服务端优化:页面静态化、并发处理、队列处理
数据库优化:数据库缓存、分库分表、分区操作、读写分离、负载均衡
防盗链
盗链:在自己页面上展示一些并不在自己服务器上的内容。常见是小站盗用大站的图片、音乐、视频等。
防盗链:防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。可以大大减轻服务器及带宽的压力
防盗链的工作原理:通过Referer或者签名,通过计算签名的方式,判断请求是否合法,如果合法则显示,否则返回错误信息
Referer
Nginx模块ngx_http_referer_module用来阻挡来源非法的域名请求,Nginx指令valid_referers,全局变量$invalid_referer
valid_referers none|block|server_names|string…;
none: “Referer”来源头部为空的情况
blocked: “Referer”来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头
server_names: “Referer”来源头部包含当前server_names
//针对防盗链的实现非法
location ~.*\.(gif|jpg|png|swf|rar|zip)$
{
valid_referers none blocked my.com*.my.com;
if ($invalid_referer)
{
rewrite ^/www.my.com/403.png;
}
}
// 针对目录的防盗链
location /images/
{
valid_referers none blocked my.com*.my.com;
if ($invalid_referer)
{
rewrite ^/www.my.com/403.png;
}
}
加密签名的方法:使用第三方模块HttpAccessKeyModule实现Nginx防盗链
accesskey on|off 模块开关
accesskey_hashmethod md5 | sha-1 签名加密方式
accesskey_arg GET参数名称
accesskey_signature 加密规则
location ~.*\.(gif|jpg|png|swf|rar|zip)$
{
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypasss$remote_addr"
}
减少HTTP请求的方式
1、合并脚本和样式表:使用外部的js和css文件引用的方式,因为这要比直接写在页面中性能要更好一些;独立的一个js比用多个js文件组成的页面载入快38%
2、图片使用base64编码减少页面请求数
3、图片地图:一个图片关联多个URL,目标URL的选择取决于用户点击图片的位置
4、CSS Sprites:CSS精灵,通过合并图片,通过制定css的background-image和background-position来显示元素
HTTP缓存机制
缓存分类:HTTP缓存模型中,如果请求成功会有三种情况
200 from cache:直接从本地缓存中获取响应,最快速,最省流量,没有向服务器发送请求
304 not modified:协商缓存,浏览器在本地没有命中的情况下请求头发送一定的校验数据到服务端,如果服务端数据没有改变浏览器从本地缓存响应,返回304
快速,发送的数据很少,只返回一些基本的响应头信息,数据量很小,不发送实际响应体
200 OK:以上两种缓存都失败,服务器返回完整响应。没有用到缓存,相对最慢。
本地缓存
浏览器认为本地缓存可以使用,不会去请求服务端
本地缓存配置
add_header指令:添加状态码为2XX和3XX的响应头信息
add_header name value [always];
可以设置Pragma/Expires/Cache-Control,可以继承
expires指令:通知浏览器过期时长
expires time;
为负值时表示Cache-Control:no-cache;
当为正或者0时,就表示Cache-Control:max-age=指定时间
location ~.*\.(gif|jpg|png|swf|rar|zip)$
{
expires 30d;
}
协商缓存相关配置
Etag指令:指定签名
etag on | off; 默认是on
前端代码和资源压缩
Gzip压缩
配置Nginx服务
gzip on|off; #是否开启gzip
gzip_buffers 32 4K|16 8K #缓冲(在内存中缓冲几块,每块多大)
gzip_comp_level [1-9] #推荐6 压缩级别(级别越高,压得越小,越浪费CPU资源)
gzip_disable #正则匹配UA 什么样的Uri不进行gzip
gzip_min_length 200 #开始压缩的最小长度
gzip_http_version 1.0|1.1 #开始压缩的http协议版本
gzip_proxied #设置请求者代理服务器,该如何缓存内容
gzip_types text/plain application/xml #对哪些类型的文件用压缩 如txt,html
gzip_vary on|off #是否传输gzip压缩标志
CDN:内容分发网络,尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,是内容传输的更快、更稳定。
CDN系统能够实时地根据网络流量和各节点的连接、负载情况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上
优势:本地Cache加速,提高企业站点的访问速度;垮运营商的网络加速,保证不同网络的用户都得到良好的访问质量;远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器;
CDN的工作原理
传统访问:用户在浏览器输入域名发起网络->解析域名获取服务器IP地址->根据IP地址找到对应的服务器->服务器响应并返回数据
使用CDN访问:用户发起请求->只能DNS解析(根据IP判断地理位置、接入网类型、选择路由最短负载最轻的服务器)->取得缓存服务器IP->把内容返回给用户(如果缓存中有)->向源网站发起请求->将结果返回给用户->将结果存入缓存服务器
CDN适用场景:站点或者应用中大量静态资源的加速分发、大文件下载、直播网站等
CDN的实现:BAT等都提供有CDN服务、可用LVS做4层负载均衡、可用Nginx,Varnish,Squid,Apache TrafficServer做7层负载均衡和Cache、适用Squid反向代理,或者Nginx等的反向代理
基于URL等应用层信息的负载均衡
Nginx的proxy是它一个很强大的功能,实现了7层负载均衡
优点:功能强大、性能好、运行稳定;配置简单灵活;能够自动剔除工作不正常的后端服务器;上传文件使用异步模式;支持多种分配策略,可以分配权重,分配方式灵活
Nginx负载均衡:内置策略、扩展策略
内置策略:IP Hash、加权轮询
扩展策略:fair策略、通用hash、一致性hash
加权轮询策略
首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器。当所有后端机器都down掉时,Nginx会立即将所有机器的标志位请成初始状态,以避免造成所有的机器都处在timeout的状态
IP Hash策略
Nginx内置的另一个负载均衡的策略,流程和轮询很类似,只是其中的算法和具体的策略有些变化;IP Hash算法是一种变相的轮询算法
fair策略
根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流
通用Hash、一致性Hash策略
通用Hash比较简单,可以以Nginx内置的变量为key进行Hash,一致性Hash采用了Nginx内置的一致性Hash环,支持memcache
Nginx配置
http {
upstream cluster {
server srv1;
server srv2;
server srv3;
}
server {
listen 80;
location / {
proxy_pass http://cluster;
}
}
}
通过报文的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器
LVS实现服务器集群负载均衡有三种方式,NAT,DR和TUN