整型0php
浮点0.0css
布尔falsehtml
空字符串'',""前端
字符串'0'mysql
空数组[]react
NULLnginx
$GLOBALS,包含下面8个超全局数组的值web
$_GET正则表达式
$_POSTredis
$_REQUERT,包含$_GET,$_POST,$_COOKIE
$_SEESION
$_COOKIE
$_SERVER
$_SERVER['SERVER_ADDR'] //服务器地址
$_SERVER['SERVER_NAME'] //服务名称
$_SERVER['REQUEST_TIME'] //请求时间
$_SERVER['QUERY_STRING'] //请求地址中问号后的内容
$_SERVER['HTTP_REFERER'] //上次请求地址
$_SERVER['HTTP_USER_AGENT'] //浏览器信息
$_SERVER['REMOTE_ARRR'] //客户端请求ip
$_SERVER['REQUEST_URI'] // 请求中脚本名称
$_SERVER['PATH_INFO'] // 请求中路径
$_FIELS
$_ENV
直接赋值NULL
未定义变量
unset销毁后的变量
必定定义,不可删除和修改
const 更快,是语言结构,可定义类常量
define 是函数
FILE 文件所在路径+文件名
LINE 所在代码行
DIR 所在文件夹路径
FUNCTION 方法名
CLASS 类名
TRAIT TRAIT的名称
METHOD 类名+方法名
NAMESPACE 命名空间名
用不一样名字访问同一个变量内容,用『&』符号表示
定义为抽象的类不能被实例化.
任何一个类,若是它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的全部抽象方法;另外,这些方法的访问控制必须和父类中同样(或者更为宽松)。
例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则二者的声明并没有冲突。
这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 以前的构造函数声明能够不同的.
使用接口(interface),能够指定某个类必须实现哪些方法,但不须要定义这些方法的具体内容。
接口是经过 interface 关键字来定义的,就像定义一个标准的类同样,但其中定义全部的方法都是空的。
接口中定义的全部方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操做符。类中必须实现接口中定义的全部方法,不然会报一个致命错误。类能够实现多个接口,用逗号来分隔多个接口的名称。
实现多个接口时,接口中的方法不能有重名。
接口也能够继承,经过使用extends操做符.
类要实现接口,必须使用和接口中所定义的方法彻底一致的方式。不然会致使致命错误.
对接口的继承使用implements,抽象类使用extends.
接口中不能够声明变量,但能够声明类常量.抽象类中能够声明各类变量
接口没有构造函数,抽象类能够有
接口中的方法默认为public,抽象类中的方法能够用public,protected,private修饰
一个类能够继承多个接口,但只能继承一个抽象类
优先级由高到低排序
==递增/递减==
非(!)
==算术运算符==
==大小比较==
(不)相等比较
引用
位运算符(^)
位运算符(|)
==逻辑与==
==逻辑或==
==三目==
==赋值==
and
oxr
or
缘由:由于计算机存储是二进制,准换进制时会有精度丢失
解决方案:先将浮点字符串化,再进行整数获取,输出可经过print
$f = 0.57;
$f = $f * 100;
// 输入可经过print
print('%d', $f);
// 用于存储或二次计算,先将浮点字符串化,再进行整数获取
$f = strval($f);
var_dump($f);
echo floor($f);
echo intval($f);
echo (int)($f);
普通变量
全局变量,经过 global
定义,能够在局部域调用全局变量,可经过 $_GLOBAL['XXX']
读取变量的值
静态变量,经过 static
定义,仅在局部域中存在,执行函数离开做用域,其值也不会消失
ip2long()
long2ip()
date()
strtotime()
mktime()
time()
microtime()
date_default_timezone_set()
print() 仅输出单个变量
printf() 按格式输出
print_r() 格式化输出
echo 输出多个变量
sprintf() 按格式返回
var_dump() 格式化输出,并输出变量类型
var_export() 将格式化输出,加true可返回,返回内容可直接作变量使用
serialize()
unserialize()
implode(),join()
explode()
strrev() 反转字符
trim(),ltrim(),rtrim()
strstr() 获取第一次出现指定字符串的字符串
number_format() 数字格式化为金钱格式
array_keys()
array_values()
array_diff()
array_megre()
array_shift()
array_unshift()
array_pop()
array_push()
sort(), rsort() 对数组升降序排序
asort(),arsort() 对数组键值升降序排序
ksort(),krsort() 对数组键名升降序排序
r/r+ 只读打开/读写打开,指针在文件开头
w/w+ 只写打开/读写打开,文件存在会清空,不存在会建立
a/a+ 写入追加写入/读写的追加写入,指针在文件末尾
x/x+ 写入/读写打开,指针开头,文件存在返回false,不存在就直接建立
b 二进制打开
fwrite()
fputs()
fread() 获取指定长度字符
fgets() 获取一行字符
fgetc() 获取一个字符
file_exist()
is_readable()
is_writable()
is_executable()
filectime() 建立时间
fileatime() 访问时间
filemtime() 更新时间
file_get_contents()
file_put_contents()
file()整个文件内容按行读取到一个数组里
readfile()整个文件读取出来,并输出
php.ini
中打开 allow_url_fopen
配置,http协议只能使用只读,ftp协议,只能只读或只写
basename() 文件基础名称
dirname() 文件夹名称
pathinfo() 文件信息数组
opendir()
readdir()
closedir()
rewinddir() 重置句柄
disk_free_space()
disk_total_space()
目录必须为空
工厂模式
单例模式
适配器模式
观察者模式
策略模式
注册树模式
__construct()
__destruct()
__call()
__callStatic()
__get()
__set()
__isset()
__unset()
__sleep()
__wakeup()
__toString()
__close()
200 请求成功
204 not content
206 reset content
301 永久重定向
302 临时重定向
307 临时重定向
400 错误请求
401 缺乏认证信息
403 拒绝
404 不存在
500 服务器异常
502 Bad Gateway
503 服务器超负载或停机维护
物理层 创建、维护、断开物理链接
数据链路层 创建逻辑链接,进行硬件地址寻址,差错校验等功能
网络层 进行逻辑地址寻址,师兄不一样网络之间的路径选择
传输层 定义传输数据的协议端口号,一级流控和差错校验。协议有TCP/UDP,数据包一旦离开网卡即进入网络传输层
会话层 创建、管理、终止会话
表示层 数据的表示、安全、压缩
应用层 网络服务与最终用户的一个借口,协议有:http(80),ftp(21),tftp,smtp(25),snmp,dns(53),telnet(23),https(443),pop3(110),dhcp
工做特色:
基于B/S模式
通讯开销小,简单快速,传输成本低
使用灵活,可以使用超文本传输协议
节省传输时间
无状态
工做原理:
客户端发送请求给服务器,创建一个TCP链接,指定端口号,默认80,链接到服务器,服务器监听到浏览器的请求,一旦监听到客户端的请求,分析请求类型后,服务器会向客户端发送状态信息和数据内容
Content-Type 指定数据内容类型
Accept 指定客户端能接受数据内容类型
Origin 最初请求来源(POST)
Cookie
Cache-Control 指定请求的缓存机制
User-Agent 用户浏览器信息
Referrer 上级请求路径
X-Forwarded-For 请求端真实ip
Access-Control-Allow-Origin 容许其余请求域名,用于跨域
Last-Modified 最后响应时间
HTTPS是一种基于SSL/TLS的HTTP协议,全部的HTTP数据都是SSL/TLS协议封装之上传输的
HTTPS是在HTTP协议的基础上,添加了SSL/TLS握手一级数据加密传输,也属于应用层协议
innodb引擎
默认事务型引擎,最重要最普遍的存储引擎,性能很是优秀
数据存储在共享表空间,可经过配置分开
对主键查询的性能高于其余类型的存储引擎
内部作了不少优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区
经过一些机制和工具支持真正的热备份
支持崩溃后的安全恢复
支持行级锁
支持外键
MyISAM引擎
5.1版本前是默认引擎
拥有全文索引、压缩、空间函数
不支持事务和行级锁,不支持奔溃后安全恢复
表存储在两个文件,MYD和MYI
设计简单,某些场景下性能很好
其余引擎:
Archive、Blackhole、CSV、Memory
当多个查询同一时刻进行数据修改时,会产生并发控制的问题
共享锁(读锁)
排他锁(写锁)
表锁
系统性能开销最小,会锁定整张表,myisam使用表锁
行锁
最大程度的支持并发处理,可是也带来了最大的锁开销,innodb实现行级锁
char
char是定长的,根据定义的字符串长度分配足量空间
char会根据须要采用空格进行填充以方便比较
char适合存储很短的字符串,或者全部值都接近同一个长度
char长度超过设定的长度,会被截断
varchar
varchar用于存储可变长字符串,比定长类型更加节省空间
varchar使用1或2个额外字节记录字符串的长度,列长度小于255字节用1个字节表示,不然用2个
varchar长度超过设定的长度,会被截断
比较
对于常常变动的数据,char比varchar更好,char不容易产生碎片
对于很是短的列,char比varchar在存储空间上更有效率
只分配真正须要的空间,更长的列会消耗更多的内存
大大减小服务器须要扫描的数据量
帮助服务器避免排序和临时表
将随机I/O变顺序I/O
大大提升查询速度,下降写的速度,占用磁盘空间
普通索引
主键索引
惟一索引
组合索引
外键索引
全文索引
最适合索引的列是出如今where子句的列,或链接子句中的列,而不是出如今select的关键字后的列
索引列的基数越大,索引效果越好
对字符串进行索引,应指定一个前缀长度,能够节省大量的索引空间
根据状况建立复合索引,复合索引能够提升查询效率
避免建立过多索引,索引会额外占用磁盘空间,减低写操做效率
主键尽量选择较短的数据类型,能够有效减小索引的磁盘占用,提升效率
复合索引遵循前缀原则
like查询,%不能在前,可使用全文索引
column is null 可使用索引
若是MySQL估计使用索引比全表扫描更慢,会放弃使用索引
打开慢查询日志,经过pt-query-dugest分析
show profile,经过 set profiling=1;
开启,服务器上执行的全部语句消耗时间都会记录到临时表。 show profile for query QUERY_ID
查询指定查询
show status,查询一些计数器,猜出哪些代价高或消耗时间多
show processlist,查询线程状态进行分析
explain,分析单个SQL语句查询
访问数据太多致使性能降低
肯定应用程序是否检索大量超过须要的数据,多是太多列或者行
肯定mysql是否分析大量没必要要的数据行
查询不须要的记录,使用limit限制
夺标关联返回所有列指定A.id,A.name
总数取出所有列,select * 会让优化器没法完成全部覆盖扫码的优化
重复查询相同的数据,能够缓存数据
改变数据库和表的结构,修改数据表范式
重写SQL语句,让优化器能够更优的执行
MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多
使用尽量少的查询是好的,可是有时将一个大的查询分解为多个小的查询是颇有必要的
分解关联查询,将一个关联查询分解为多个sql来执行,让缓存效率更高,执行单个查询能够减小锁的竞争,在应用层作关联能够更容易对数据库进行拆分,查询效率会有大幅提高,较少冗余记录的查询
优化count()查询, count(*)
会忽略全部列,直接统计全部列数,所以不要用 count(列名)
优化关联查询,肯定ON或者USING子句的列上有索引;确保 GROUP BY
和 ORDER BY
中只有一个表的列,这样MySQL才有可能使用索引
优化子查询 建议使用关联查询替代
优化 GROUP BY
和 DISTINCT
,创建索引进行优化
优化 LIMIT
分页,能够经过记录上次查询的最大ID,若是根据id排序时,下次查询根据该ID来查询(如:ID > maxID)
优化 UNION
查询, UNION ALL
性能比 UNION
高
对用户而言,分区表是一个独立的逻辑表,可是底层MySQL将其分红了多个物理子表,对于用户来讲是透明的,每个分区表都会使用一个独立的表文件。
建立表的时候使用 partition by
子句定义每一个分区存放的数据,执行查询时,优化器会根据分区定义过滤那些没有咱们须要数据的分区,这样查询只须要查询所需数据在的分区便可
分区的主要目的是将数据按照一个较粗的粒度分在不一样的表中,这样能够将相关的数据存放在一块儿,并且若是想一次性删除整个分区的数据也很方便
表很是大,没法所有存在内容,或者只有表的最后有热点数据,其余都是历史数据
分区表的数据更易维护,能够对独立的分区进行独立操做
分区表的数据能够分布在不一样机器上,从而高效使用资源
可使用分区表来避免某些特殊瓶颈
能够备份和恢复独立分区
一个表最多只能有1024个分区
5.1版本中,分区表表达式必须是整数,5.5可使用列分区
分区字段中若是有主见和惟一索引列,那么主键和惟一列都必须包含进来
分区表中没法使用外键约束
须要对现有表的结构进行改变
全部分区都必须使用相同的存储引擎
分区函数中可使用的函数和表达式会有一些限制
某些存储引擎不支持分区
对于MyISAM的分区表,不能使用load index into cache
对于MyISAM表,使用分区表时须要打开更多的文件描述符
经过一些HASH算法或者工具实现将一张数据表垂直或者水平物理切分
单表记录条数达到百万到千万级别时
解决表锁的问题
水平切分:表很大,分割后能够减低在查询时须要读的数据和索引的页数,同时也减低了索引的层数,提升查询速度
使用场景:
1. 表中数据自己就有独立性,例如表中分别记录各个地区的数据或者不一样时期的数据,特别是有些数据经常使用,有些不经常使用
2. 须要把数据存放在多个介质
缺点:
1. 给应用增长复杂度,一般查询时须要多个表名,查询全部数据都须要UNION操做
2. 在许多数据库应用中,这种复杂性会超过他带来的优势,查询时会增长读一个索引层的磁盘次数
垂直分表:把主键和一些列放在一个表,而后把主键和另外的列放在另外一张表中
使用场景:
1. 若是一个表中某些列经常使用,而另一些列不经常使用
2. 可使数据行变小,一个数据页能存储更多数据,查询时减小I/O次数
缺点:
1. 管理冗余列,查询全部数据须要JOIN操做
2. 有些分表的策略基于应用层的逻辑算法,一旦逻辑算法改变,整个分表逻辑都会改变,扩展性较差
3. 对于应用层来讲,逻辑算法无疑增长开发成本
在主库上把数据更改记录到二进制日志
从库将主库的日志复制到本身的中继日志
从库读取中继日志中的事件,将其重放到从库数据中
数据分布:随意中止或开始复制,并在不一样地理位置分布数据备份
负载均衡:减低单个服务器压力
高可用和故障切换:帮助应用程序避免单点失败
升级测试:可使用更高版本的MySQL做为从库
使用预处理语句防SQL这几日
写入数据库的数据要进行特殊字符转移
查询错误信息不要返回给用户,将错误记录到日志
按期作数据备份
不给查询用户root权限,合理分配权限
关闭远程访问数据库权限
修改root口令,不用默认口令,使用较复杂的口令
删除多余的用户
改变root用户的名称
限制通常用户浏览其余库
限制用户对数据文件的访问权限
model 数据模型操做层,是应用程序中用于处理应用程序数据逻辑的部分
view 视图层,是应用程序中处理数据显示的部分。
controller 业务处理层,是应用程序中处理用户交互的部分。
用一个处理程序文件处理全部的HTTP请求,根据请求时的参数的不一样区分不一样的模块和操做请求
能够进行统一的安全性检查
集中处理程序
URL不美观(解决方法:URL重写)
处理效率会下降(可忽略)
PHP是一种HTML内嵌式在服务端执行的脚本语言,可是PHP又不少可使PHP代码和HTML代码分开的模板引擎,例如:smarty
模板引擎就是庞大的完善的正则表达式替换库
原理:两两相邻的数进行比较,若是反序就交换,不然不交换
时间复杂度:最坏(O(n^2)), 平均(O(n^2))
空间复杂度:O(1)
原理:经过一趟排序将要排序的数据分割成独立的两部分,其中一部分的全部数据和另外一部分的全部数据都要笑,而后按照此方法对这两部分数据分别进行快速排序,整个排序过程能够递归完成
时间复杂度:最坏(O(n^2)), 平均(O(nlog2n))
空间复杂度:最差(O(n)),平均(O(log2n))
原理:每次从无序表中取出第一个元素,把他插入到有序表的合适位置,使有序表仍然有序
时间复杂度:最坏(O(n^2)), 平均(O(n^2))
空间复杂度:O(1)
原理:每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,知道所有待排序的数据元素排外
时间复杂度:最坏(O(n^2)), 平均(O(n^2))
空间复杂度:O(1)
原理:把待排序的数据根据增量分红几个子序列,对子序列进行插入排序,知道增量为1,直接插入进行插入排序;增量的排序,通常是数组的长度的一半,再变为原来增量的一半,直到增量为1
时间复杂度:最坏(O(n^2)), 平均(O(nlog2n))
空间复杂度:O(1)
原理:把待排序的元素按照大小在二叉树位置上排序,排序好的元素要知足:父节点的元素要大于子节点;这个过程叫作堆化过程,若是根节点存放的最大的数,则叫作大根堆,若是是最小,就叫小跟堆,能够把根节点拿出来,而后再堆化,循环到最后一个节点
时间复杂度:最坏(O(nlog2n)), 平均(O(nlog2n))
空间复杂度:O(1)
原理:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为总体有序序列
时间复杂度:最坏(O(nlog2n)), 平均(O(nlog2n))
空间复杂度:O(n)
原理:从数组的中间元素开始,若是中间元素正好是要查找的元素,搜索结果,若是某一个特定元素大于或者小于中间元素的那一半中查找,并且跟开始同样从中间开始比较,若是某一步骤数组为空,表明找不到
时间复杂度:最坏(O(nlog2n)), 平均(O(nlog2n))
空间复杂度:迭代(O(1)), 递归(O(log2n))
原理:按必定的顺序检查数组中每个元素,直到要找到锁要寻找的特定指为止
时间复杂度:最坏(O(n)), 平均(O(n))
空间复杂度:O(1)
QPS:每秒钟请求或查询数量,在互联网领域指每秒响应的请求数(指HTTP请求)
吞吐量:单位时间内处理的请求数量(一般由QPS和并发数决定)
响应时间:从请求发出到收到响应花费时间
PV:综合浏览量(Page View),即页面浏览量或者点击量,一个访客在24小时内访问的页面数量。同一我的浏览你的网站同一个页面,只记做一次PV
UV:独立访客(UniQue Visitor),即必定时间范围内相同访客屡次访问网站,只能计算为1个独立访客
带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小
日网站带宽=PV/统计时间(秒) 平均页面大小(KB) 8
峰值通常是平均值的倍数
QPS不等于并发并发链接数。QPS是每秒HTTP请求数量,并发链接数是系统同时处理的请求数量
二八定律(80%的访问量集中在20%的时间):(总PV数 80%)/(6小时秒速 20%)=峰值每秒请求数(QPS)
压力测试:能承受最大的并发数和最大承受的QPS值
ab,wrk,Apache JMeter, http_load, Web Bench, Siege
# 模拟并发请求100次,总请求5000次
ab -c 100 -n 5000 http://example.com
测试机器与被测机器分开
不要对线上服务作压力测试
观察测试工具所在机器,以及被测试的前端机的CPU、内存、网络等都不超过最高限度的75%
QPS达到50,能够称之为小型网站,通常服务器均可以应付
QPS达到100;瓶颈:MySQL查询达到瓶颈;优化方案:数据库缓存层,数据库负载均衡
QPS达到800;瓶颈:带宽速度达到瓶颈;优化方案:CDN加速,负载均衡
QPS达到1000;瓶颈:缓存服务器的带宽达到瓶颈;优化方案:静态HTML缓存
QPS达到2000;瓶颈:文件系统访问锁成为灾难;优化方案:作业务分离,分布式存储
防盗链处理
减小HTTP请求
添加异步请求
启用浏览器缓存和文件压缩
CDN加速
创建独立的图片服务器
页面静态化
并发处理
数据库缓存
分库分表、分区操做
读写分离
负载均衡
负载均衡
倒链是指在本身的页面上展现一些并不在服务器上的内容
得到他人服务器上的资源地址,绕过别人的资源展现页面,直接在本身的页面上向最终用户提供此内容
常见的是小站盗用大站的图片、音乐、视频、软件等资源
倒链能够减轻本身的服务器负担
防止别人经过一些技术手段绕过本站的资源展现页面,盗用本站的资源,让绕开本站资源展现页面的资源连接失效,能够大大减轻服务器及带宽的压力
经过Referer或者计算签名,网站能够检测目标网页访问的来源网页,若是是资源文件,则能够跟踪到显示他的网页地址
一旦检测到来源不是本站即进行阻止或返回指定的页面
NGINX模块ngx_http_referer_module用来阻挡来源非法的域名请求
NGINX指令valid_referers,全局变量$invalid_referer
valid_referers none|blocked|server_names|string...;
none: Referer来源头部为空的状况,好比直接打开
blocked: Referer来源头部不为空,可是里面的值被代理或者防火墙删除了,这些值都不以 http://或者https ://开头
server_names: Referer来源头部包含当前的server_names
配置例子:
location ~.*\.(gif|jpg|png|flv|swf|rar}zip)$
{
valid_referers none blocked imooc.com *.imooc.com;
if ($invalid_referer)
{
#return 403;
rewrite ^/ http://www.imooc.com/403.jpg;
}
}
域名解析
TCP链接
发送请求
等待
下载资源
解析
减小组件的数量,并由此减小HTTP请求的数量
图片地图:图片地图容许你在一个图片上关联多个URL。目标URL的选择取决于用户蛋鸡了图片上的哪一个位置
CSS Sprites:css 精灵,经过使用合并图片,经过指定css的background-image和background-position来显示元素
合并脚本和样式表适
图片使用base64编码减小页面请求数
200 from cache:直接从本地缓存中获取响应,最快速,最省流量,由于根本没有向服务器发送请求
304 Not Modified:协商缓存,浏览器在本地没有命中的状况下,请求头中发送必定的校验数据到服务端,若是服务端的数据没有改变,浏览器从本地缓存响应,返回304。特色:快速,发送的数据不多,只返回一些基本的响应头信息,数据量很小,不发送实际响应体
200 OK:以上两种缓存所有失败,服务器返回完整响应。没有用到缓存,相对最慢
pragma:HTTP1.0时代的遗留产物,该字段被设置为no-cache时,会告知浏览器禁用本地缓存,即每次都向服务器发送请求
Expires:HTTP1.0时代用来启用本地缓存的字段,设置值如‘Thu, 31 Dec 2037 23:55:55 GMT’的格林威治的时间。但浏览器与服务器的时间没法保持一致,若是差距大就会影响缓存结果
Cache-Control:HTTP1.1针对Expires时间不一致的解决方案,运用Cache-Control告知浏览器缓存过时的时间间隔而不是时刻,即便具体时间不一致,也不影响缓存的管理
优先级:Pragma > Cache-Control > Expires
no-store:禁止浏览器缓存响应
no-cache:不容许直接使用本地缓存,先发起请求和服务器协商
max-age=delta-seconds:告知浏览器该响应本缓存的有效的最长期限,以秒为单位
当浏览器没有命中本地缓存,如本地缓存过时或者响应中声名不容许直接使用本地缓存,那么浏览器确定会发起服务端请求
服务端会验证数据是否修改,若是没有就通知浏览器使用本地缓存
Last-Modified:通知浏览器资源的最后修改时间,设置值如‘Thu, 31 Dec 2037 23:55:55 GMT’的格林威治的时间
If-Modified-Since:获得资源的最后修改时间后,会将这个信息经过If-Modified-Since提交到服务器作检查,若是没有修改,返回304状态码,设置值如‘Thu, 31 Dec 2037 23:55:55 GMT’的格林威治的时间
ETag:HTTP1.1推出,文件的指纹标识符,若是文件内容修改,指纹也会改变,设置值如‘5a643fc7-38a3’
If-None-Match:本地缓存失效,会携带此值去请求服务端,服务端判断该资源是否改变,若是没有改变,直接使用本地缓存,返回304
不变的图像,如logo,图标等
js、css静态文件
可下载的内容,媒体文件
HTML文件
常常替换的图片
常常修改的js、css文件,js、css文件的加载能够加入文件的签名来拒绝缓存,如‘index.css?签名’,‘index.签名.js’
用户隐私等敏感数据
常常改变的API数据接口
add_header name value [always];
expires time;
etag on|off
让资源文件更小,加快文件在网络中的传输,让网页更快的展示,下降带宽和流量的开销
js、css、图片、html代码的压缩
gzip压缩
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 image/png #对哪些类型的文件压缩,如txt、xml、css
gzip_vary on|off #是否传输gzip压缩标志
CDN的全称content delivery network,内容分发网络
尽量避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定
在网络各处放置节点服务器所构成的有的互联网基础之上的一层智能虚拟网络
CDN系统可以实现地根据网络流量和各节点的链接、负载情况以及到用户距离和响应时间等综合信息将用户的请求从新导向离用户最近的服务节点上
本地cache加速,提升了企业站点(尤为含有大量图片和静态页面站点)的访问速度
跨运营商的网络加速,保证不一样网络的用户都能获得良好的访问质量
远程访问用户根据DNS负载均衡技术只能选择cache服务器
自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减小远程访问的带宽、分担网络流量、减轻原站点web服务器负载等功能
普遍分布的cdn节点加上节点之间的智能冗余机制,能够有效地预防黑客入侵
用户发起请求
智能DNS的解析(根据IP判断地理位置、接入网类型、选择路由最短和负载最轻的服务器)
取得缓存服务器ip
把内容返回给用户(若是缓存中有,没有就执行五、六、7)
向源站发起请求
将结果返回给用户
将结果存入缓存服务器
站点或者应用中大量静态资源的加速分发,例如css、js、图片和HTML
大文件下载
直播网站
分担web服务器的I/O负载,将耗费资源的图片服务器分离出来,提升服务器的性能和稳定性
可以专门对图片服务器进行优化,为图片服务器设置针对性的缓存方案,减小带宽成本,提升访问速度
提升网站的可扩展性,经过增长图片服务器,提升图片吞吐能力
同一域名下浏览器的并发链接数有限制,突破浏览器链接数的限制
因为cookie的缘由,对缓存不利,大部分web cache都只缓存不带cookie的请求,致使每次的图片请求都不能命中cache
NFS共享方式
利用FTP同步
将现有的PHP等动态语言的逻辑代码生成为静态的HTML文件,用户访问动态脚本重定向到静态HTML文件的过程。对实时性要求不高
动态脚本经过会作逻辑计算和数据查询,访问量越大,服务器压力越大
访问量大时可能会形成CPU负载太高,数据库服务器压力过大
静态化能够减低逻辑处理压力,下降数据库服务器查询压力
使用模板引擎
利用ob系列函数
ob_start();//打开输出控制缓冲
ob_get_content();//返回输出缓冲区内容
ob_clean();//清空输出缓冲区
ob_end_flush();//冲刷出(送出)输出缓冲区内容并关闭缓冲
是计算机中程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单元,是操做系统结构的基础。进程是一个执行中的程序
进程的三态模型:运行、就绪、阻塞
进程的五态模型:新建态、活跃就绪/静止就绪、运行、活跃阻塞/静止阻塞、终止态
新建态:对应于进程刚刚被建立时没有被提交的状态,并等待系统完成建立进程的全部必要信息
终止态:进程已结束运行,回收除进程控制块以外的其余资源,并让其余进程从进程控制块中收集有关信息。
活跃就绪:是指进程在主存而且可被调度的状态。
静止就绪(挂起就绪):是指进程被对换到辅存时的就绪状态,是不能被直接调度的状态,只有当主存中没有活跃就绪态进程,或者是挂起就绪态进程具备更高的优先级,系统将把挂起就绪态进程调回主存并转换为活跃就绪。
活跃阻塞:是指进程已在主存,一旦等待的事件产生便进入活跃就绪状态。
静止阻塞:进程对换到辅存时的阻塞状态,一旦等待的事件产生便进入静止就绪状态。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程本身不拥有系统资源,只拥有一点儿在运行中必不可少的资源但它可与同属一个进程的其它线程共享进程所拥有的所有资源。
一个线程能够建立和撤消另外一个线程,同一进程中的多个线程之间能够并发执行。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。
在单个程序中同时运行多个线程完成不一样的工做,称为多线程。
协程是一种用户态的轻量级线程,协程的调度彻底由用户控制。协程拥有本身的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操做栈则基本没有内核切换的开销,能够不加锁的访问全局变量,因此上下文的切换很是快。
线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有本身独立的地址空间
进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
线程是处理器调度的基本单位但进程不是
两者都可并发执行
每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
一个线程能够多个协程,一个进程也能够单独拥有多个协程
线程进程都是同步机制,而协程则是异步
协程能保留上一次调用时的状态,每次过程重入时,就至关于进入上一次调用的状态
单进程单线程:一我的在一个桌子上吃菜
单进程多线程:多我的在同一个桌子上一块儿吃菜
多进程单线程:多我的每一个人在本身的桌子上吃菜
建立一个 socket
进入 while循环,阻塞在进程accept操做上,等待客户端链接进入主进程在多进程模型下经过fork刨建子进程
收到数据后服务器程序进行处理而后使用send向客户端发送响应
当客户端链接关闭时,子进程/线程退出并销毁全部资源。主进程/线程会回收掉此子进程/线程。
多线程模型下能够建立子线程
子进程/线程建立成功后进入while循环,阻塞在recv调用上,等待客户端向服务器发送数据
收到数据后服务器程序进行处理而后使用send向客户端发送响应
当客户端链接关闭时,子进程/线程退出并销毁全部资源。主进程/线程会回收掉此子进程/线程。
这种模型严重依赖进程的数量解决并发问题
启动大量进程会带来额外的进程调度消耗
如今各类高并发异步IO的服务器程序都是基于epoll实现的
IO复用异步非阻塞程序使用经典的Reactor模型,Reactor顾名思义就是反应堆的意思,它自己不处理任何数据收发。只是能够监视一个 socket句柄的事件变化
Add:添加一个 SOCKET到 Reactor
Set:修改 SOCKET对应的事件,如可读可写
Del:从 Reactor中移除
Callback:事件发生后回调指定的函数
常见reactor模型
Nginx:多线程 Reactor
Swoole:多线程 Reactor+多进程Worker
查询缓存能够看作是SQL文本和查询结果的映射,第二次查询的SQL和第一次查询的SQL全相同,则会使用缓存
表的结构或数据发生改变时,查询缓存中的数据再也不有效
query_cache_type
查询缓存类型,有0、一、2三个取值。0则不使用查询缓存。1表示始终使用查询缓存。2表示按需使用查询缓存。
query_cache_size
默认状况下 query_cache_size
为0,表示为查询缓存预留的内存为0,则没法使用查询缓存
SET GLOBAL query_cache_size= 134217728
querycache_type
为1时,亦可关闭查询缓存
SELECT SQL_NO_CACHE FROM my_table WHERE condition;
query_cache_type
为2时,可按需使用查询缓存
SELECT SQL_CACHE FROM my_table WHERE condition;
查看命中次数
SHOW STATUS LIKE'Qcache_hits';
清理缓存
FLUSH QUERY CACHE∥清理查询缓存内存碎片
RESET QUERY CACHE∥从查询缓存中移出全部查询
FLUSH TABLES;//关闭全部打开的表,同时该操做将会清空查询
缓存中的内容
redis
/ memcache
缓存Redis,依赖客户端来实现分布式读写
Memcache自己没有数据冗余机制
Redis支持(快照、AOF),依赖快照进行持久化,aof加强了可靠性的同时,对性能有所影响
Memcache不支持持久化,一般作缓存,提高性能;
Memcache在并发场景下,用cas保证一致性, redis事务支持比较弱,只能保证事务中的每一个操做连续执行
Redis支持多种类的数据类型
Redis用于数据量较小的高性能操做和运算上
Memcache用于在动态系统中减小数据库负载,提高性能;适合作缓存,提升性能
tinyint、 smallint、 bigint 考虑空间的问题,考虑范围的问题
char、varchar
enum 特定、固定的分类可使用enum存储,效率更快
ip地址 ip2long() 转成长整型存储
索引不是越多越好,在合适的字段上建立合适的索引
复合索引的前缀原则
复合索引的前缀原则
like查询%的问题
全表扫描优化
or条件索引使用状况
字符串类型索引失效的问题
使用 Limit
返回列不用*
变复杂为简单
切分查询
分解关联查询
优化 count()
优化关联查询
优化子查询
优化 Group by和 distinct
优化 limit和 union
尽可能使用 Inno DB存储引擎
经过特定的策略对数据表进行物理拆分
对用户透明
partition by
水平拆分
垂直拆分
主从复制
读写分离
双主热备
负载均衡
经过LVS的三种基本模式实现负载均衡
MyCat数据库中间件实现负载均衡
基于URL等应用层信息的负载均衡
Nginx的 proxy是它一个很强大的功能,实现了7层负载均衡
功能强大,性能卓越,运行稳定
配置简单灵活
可以自动剔除工做不正常的后端服务器
上传文件使用异步模式
支持多种分配策略,能够分配权重,分配方式灵活
内置策略: IP Hash、加权轮询
扩展策略:fair策略、通用hash、一致性hash
首先将请求都分给高权重的机器,直到该机器的权值降到了比其余机器低,才开始将请求分给下一个高权重的机器
当全部后端机器都down掉时,Ngnx会当即将全部机器的标志位清成初始状态,以免形成全部的机器都处在 timeout的状态
Nginx内置的另外一个负载均衡的策略,流程和轮询很相似,只是其中的算法和具体的策略有些变化
IP Hash算法是一种变相的轮询算法
根据后端服务器的响应时间判断负载状况,从中选出负载最轻的机器进行分流
通用hash比较简单,能够以 Nginx内置的变量为key进行hash,
一致性hash采用 Nginx了内置的一致性hash环,支持 memcache
http {
upstream cluster {
server srvl;
server srv2;
server srv3;
}
server {
listen 80;
location /
proxy_pass http: //cluster;
}
}
经过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器
LvS实现服务器集群负载均衡有三种方式,NAT,DR和TUN