转载:https://blog.csdn.net/wj610671226/article/details/78426698php
正则表达式css
做用:分割、查找、匹配、替换字符串 分割符:正斜线(/)、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()html
魔术方法
__construct() 构造方法
__destruct() 析构方法
__call() 在对象中调用一个不可访问或者不存在的方法时,__call() 会被调用
__callStatic() 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用
__get() 读取不可访问属性的值时,__get() 会被调用
__set() 在给不可访问属性赋值时,__set() 会被调用
__isset() 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用
__unset() 当对不可访问属性调用 unset() 时,__unset() 会被调用
__toString() echo输出一个对象会调用
__clone() 克隆一个对象
1
2
3
4
5
6
7
8
9
10
11
网络
常见状态码: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、POP三、HTTP、DNS
数据库
InnoDB表引擎
默认事务型引擎,最重要最普遍的存储引擎,性能很是优秀。数据存储在共享表空间,能够经过配置分开。对主键查询的性能高于其余类型的存储引擎。内部作了不少优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区
经过一些机制和工具支持真正的热备份,支持崩溃后的安全恢复,支持行级锁,支持外键
MyISAM表引擎
5.1版本前,MyISAM是默认的存储引擎,拥有全文索引、压缩、空间函数。不支持事务和行级锁,不支持奔溃后的安全恢复。表存储在两个文件,MYD和MYI。设计简单,某些场景下性能很好
其余的表引擎
Archive、Blackhole、CVS、Memory
索引对性能的影响
大大减小服务器须要扫描的数据量,帮助服务器避免排序和临时表、将随机I/O变顺序I/O,大大提升查询速度,下降写的速度、占用磁盘
索引的使用场景
对于很是小的表,大部分状况下全表扫描效率更高。中到大型表,索引很是有效。特大型的表,创建和使用索引的代价随之增加,可使用分区技术来解决
索引的类型
普通索引:最基本的索引,没有任何约束限制
惟一索引:与普通索引相似,可是具备惟一性约束
主键索引:特殊的惟一索引,不容许有空值
组合索引:将多个列组合在一块儿建立索引,能够覆盖多个列
外键索引:只有InnoDB类型的表才可使用外键索引,保证数据的一致性、完整性和实现级联操做
全文索引:MySQL自带的全文索引只能用于MyISAM,而且只能对英文进行全文索引
一个表只能有一个主键索引,能够有多个惟一索引。主键索引必定是惟一索引,惟一索引不是主键索引。主键能够与外键构成参照完整性约束,防止数据不一致
MySQL索引的建立原则
一、最适合索引的列是在where子句中的列,或链接子句中的列而不是出如今select关键字后的列
二、索引列的基数越大。索引的效果越好
三、对字符串进行索引,应该制定一个前缀长度,能够节省大量的索引空间
四、根据状况建立复合索引,复合索引能够提升查询效率
五、避免建立过多索引,索引会额外占用磁盘空间,下降写操做效率
六、主键尽量选择短的数据类型,能够有效减小索引的磁盘占用提升查询效率
MySQL索引的注意事项
一、复合索引遵循前缀原则
二、like查询。%不能在前,可使用全文索引
三、column is null可使用索引
四、若是MySQL估计使用索引比全表扫描更慢,会放弃使用索引
五、若是or前的条件中的列有索引,后面的没有,索引都不会被用到
六、列类型是字符串,查询时必定要给值加引号,不然索引失效
查找分析SQL查询慢的缘由
一、记录慢查询日志:分析查询日志,不要直接打开查询日志进行分析,这样比较浪费时间和精力,可使用pt-query-digest工具进行分析
二、使用show profile: set profiling=1;开启,服务器上执行的全部语句会检测消耗的时间,存到临时表中(show profiles;show profiles for query 临时表ID)
三、使用show status: show status 会返回一些计数器,show global status 查看服务器级别的全部计数;有时根据这些计数,能够猜想出哪些操做代价较高或者消耗时间多
四、使用show processlist 观察是否有大量线程处于不正常的状态
五、使用explain:分析单条SQL语句
优化查询过程当中的数据访问
访问数据太多致使查询性能降低
一、肯定应用程序是否在检索大量超过须要的数据,多是太多行或列
二、确认MYSQL服务器是否在分析大量没必要要的数据行
避免使用以下SQL语句
一、查询不须要额记录,使用limit解决
二、多表关联返回所有列,指定A.id,B.age
三、老是取出所有列,SELECT * 会让优化器没法完成索引覆盖扫描的优化
是否在扫描额外的记录
使用explain来进行,若是发现查询须要扫描大量数据但只返回少数的行,能够经过以下技巧去优化:使用索引覆盖扫描,把全部用的列都放到索引中,这样存储引擎不须要回表获取对应行就能够返回结果
改变数据库和表的结构,修改数据表范式(冗余)。重写SQL语句,让优化器能够以更优的方式执行查询
优化长难的查询语句
一、一个复杂查询仍是多个简单查询
MYSQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多
使用尽量少的查询是好的,可是有时将一个大的查询分解为多个小的查询时颇有必要的
二、切分查询
将一个大的查询分为多个小的相同的查询
一次性删除1000万的数据要比一次删除一万,暂停一会的方案更加耗损服务器开销
三、分解关联查询
能够将一条关联语句分解成多条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子句定义每一个分区存放的数据,执行查询时,优化器会根据分区定义过滤那些没有咱们须要数据的分区,这样查询只须要所需数据在的分区便可
分区的主要目的是将数据按照一个较粗的粒度分在不一样的表中,这样能够将相关的数据存放在一块儿,并且若是想一次性删除整个分区的数据也很方便
适用场景
一、表很是大,没法所有存在内存或者只在表最后有热点数据,其余都是历史数据
二、分区表的数据更易维护,能够对独立的分区进行独立的操做
三、分区表的数据能够再不一样的机器上,从而高效适用资源
四、可使用分区表来避免某些特殊的瓶颈
五、能够备份和恢复独立的分区
限制
一、一个表最多只能有1024个分区
二、5.1版本中,分区表表达式必须是整数,5.5可使用列分区
三、分区字段中若是有主键和惟一索引列,那么主键列和惟一列都必须包含进来
四、分区表中没法使用外键约束
五、须要对现有表的结构进行修改
六、全部分区都必须使用相同的存储引擎
七、分区函数中可使用的函数和表达式会有一些限制
八、某些存储引擎不支持分区
九、对于MyISAM的分区表,不能使用load index into cache
十、对于MyISAM表,使用分区表时须要打开更多的文件描述
水平分表缺点
一、给应用增长复杂度,一般查询时须要多个表名,查询全部数据都需union操做
二、在许多数据库应用中,这种复杂性会超过它带来的优势,查询时会增长读一个索引层的磁盘次数
使用场景
1.若是一个表中某些列经常使用,而另一些列不经常使用
2.可使数据行变小,一个数据页能存储更多数据,查询时减小I/O次数
SQL查询的安全方案
一、使用预处理语句防SQL注入
二、写入数据库的数据要进行特殊字符的转义
三、查询错误信息不要返回给用户,将错误记录到日志
MySQL的其余安全设置
一、按期作数据备份
二、不给查询用户root权限,合理分配权限
三、关闭远程访问数据库权限
四、修改root口令,不用默认口令,使用较复杂的口令
五、删除多余的用户
六、改变root用户的名称
七、限制通常用户浏览其余库
八、限制用户对数据文件的访问权限
单一入口的工做原理
工做原理:用一个处理程序文件处理全部的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
高并发注意事项
一、测试机器与被测试机器分开
二、不要对线上服务作压力测试
三、观察测试工具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请求的方式
一、合并脚本和样式表:使用外部的js和css文件引用的方式,由于这要比直接写在页面中性能要更好一些;独立的一个js比用多个js文件组成的页面载入快38%
二、图片使用base64编码减小页面请求数
三、图片地图:一个图片关联多个URL,目标URL的选择取决于用户点击图片的位置
四、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--------------------- 做者:开发小猫 来源:CSDN 原文:https://blog.csdn.net/wj610671226/article/details/78426698 版权声明:本文为博主原创文章,转载请附上博文连接!