一、什么是高并发(高并发的一系列名词解释)
QPS :每秒钟请求或查询的数量,在互联网领域,指每秒钟响应请求数(http请求)。
吞吐量:单位时间内处理的请求数量。
响应时间:从请求发出到相应完毕的时间。
PV:综合浏览量(Page View),即页面浏览量货值点击量,一个访客在24小时访问的页面数量。
(总PV数 * 80%)/(6小时秒数*20%) = 峰值每秒请求数(QPS) 表示:80%的浏览量集中在20%的时间
QPS 达到 100:数据库负载均衡,数据库缓存
QPS 达到 800:CDN加速,负载均衡
QPS 达到 1000:静态HTML缓存
QPS 达到 2000:做业务分离,分布式存储
二、高并发的解决方法——资源防盗链
1、盗链:指自己的页面上展示一些并不在自己服务器上的内容
2、防盗链:防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失败。(可以大大减轻服务器以及带宽的压力)
3、防盗链的措施
① 通过referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到它的显示网页地址,一旦检测到来源不是本站,立即进行阻止或者返回指定页面。(但是referer可以伪造,不能够防治根本)
② 使用加密签名
使用第三方模块HttpAccesskeyModule实现Nginx防盗链
accesskey on|off 模块开关
accesskey_hashmethod MD5|sha-1 签名加密方式
accesskey_arg GET参数名称
accesskey_signature 加密规则
三、高并发的解决方法——减少http请求数
在网站的请求中,有很大一部分是来自对图片资源的访问,但图片的响应速度远远低于文字的,所以可以尝试使用减少http的请求数来减轻服务器的压力。
① 图片地图
② CSS精灵,通过使用合并图片,通过指定CSS的background-image和background_position来显示元素
③ 合并样式和合并脚本
④ 图片使用base64编码减少页面请求数
四、高并发的解决方法——浏览器缓存和压缩优化技术
1、http的缓存机制(缓存分类)
① 200 OK (from memory cache) 直接从本地缓存中获取响应,最快速,最省流量,根本没有想服务器发送请求。
② 304 NOT Modifined 协商缓存,浏览器在本地没有命中的情况下请求头中发送一定的校验数据到服务端,如果服务端数据没有改变,浏览器会从本地缓存响应,返回304。
③ 200 OK 以上两种缓存全部失败,服务器返回完整的响应,没有用到缓存,相对最慢。
解决方法:Nginx 配置缓存策略 expires 缓存时间
2、前端代码和资源的压缩
javascript 代码压缩(去除多余空格,回车,替换长变量名,简化代码写法)
CSS代码压缩
HTML代码压缩(不建议)
图片压缩(压缩工具:tinypng,JPEGMini,imageoptIM)
五、高并发的解决方法——CDN加速
CDN(content delivery network) 内容分发网络
在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层只能虚拟网络
优势:① 本地cache加速,提高的企业站点的访问速度。② 跨运营商的网络加速,保证不同网络的用户都得到良好的访问质量。
工作原理:
用户发起请求——>智能DNS的解析(根据IP判断地理位置,接入网类型,选择路由最短和负载最轻的服务器)——>取得缓存服务器IP——>把内容返回给用户(如果缓存中有)——>向源站发起请求——>将结果返回给用户——>将结果存入缓存服务器
适用场景:
① 站点或者应用中大量静态资源的加速分发,例如:CSS,js图片和HTML
② 大文件下载
③ 直播网站等
CDN的实现:
使用squid的反向***,或者Nginx等的反向***
六、高并发的解决方法——独立图片服务器的部署
① 分担web服务器的I/O负载——将耗费资源的图片服务分离出来,提高服务器的性能和稳定性。
② 能够专门对图片服务器进行优化,为图片服务设置有针对性的缓存方案,减少带宽成本,提高访问速度。
③ 提高网站的可扩展性——通过增加图片服务器,提高图片吞吐能力,采用独立域名。
需要注意的是:
如何让进行图片上传和图片同步(可 NFS共享方式,利用FTP同步)
七、高并发的解决方法——动态语言静态化
含义:将现有PHP等动态语言的逻辑代码生成为静态HTML文件,用户访问动态脚本重定向到静态HTML文件的过程(对实时性要求不高的页面)
实现方式:
① 使用模板引擎
使用smarty的缓存机制生成静态HTML缓存文件
$smarty->cache_dir = $ROOT."/cache"; //缓存目录
$smarty->caching = true; //是否开启缓存
$smarty->cache_lifetime = "3600"; //缓存时间
$smarty->display(string template[,string cache_id[,string compile_id]]);
$smarty->clear_all_cache(); //清除所有缓存
$smarty->clear_cache('file.html'); // 清除指定的缓存
$smarty->clear_cache('artcle.html',$art_id); //清除同一个模板下的指定缓存号的缓存
② 利用ob系列化的函数
ob_start(): 打开输出控制缓冲
ob_get_contents():返回输出缓冲区的内容
ob_clean():清空输出缓冲区
ob_end_flush():冲刷出(送出)输出缓冲区的内容并关闭缓冲
例:
ob_start();
输出页面的html代码。。。
ob_get_contents();
ob_end_flush();
fopen() 写入html文件中;
判断html文件是否存在,是否过期,直接调用
八、高并发的解决方法——对动态语言并发处理
1、并发相关名词解释
进程 与 线程的区别
① 一个进程下可以拥有多个线程,多个线程共享进程的地址空间,而进程有自己独立的地址空间。
② 进程是资源分配和拥有的基本单位,同一个进程内的线程共享进程的资源。
③ 线程是处理器调度的基本单位,但进程不是
④ 二者均可并发进行
⑤ 每个独立的线程里有一个程序运行的入口,顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程与协程的区别
① 一个线程可以多个协程,一个进程也可以单独拥有多个协程
② 线程进程都是同步机制,而协程则是异步
③ 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
多个概念之间的区别 :
单进程单线程:一个人在一个桌子上吃菜
单进程多线程:多个人在一个桌子上吃菜
多进程多线程:多个人每个人在自己的桌子上吃菜
2、PHP并发的编程实例
① PHP的swoole扩展
② 消息队列(订单与库存的解耦,流量削峰,日志处理(大量传输日志))
③ 接口的并发请求(curl_multi_init)
九、高并发的解决方法——数据库缓存层的优化
极大解决数据库服务器压力,提高应用数据的响应速度,使用memcache与redis用作数据库的缓存。
1、MySQL的查询缓存
启用MySQL查询缓存:
query_cache_type 查询缓存类型
为0时,不使用查询缓存
为1时,始终使用查询缓存
为2时,按需使用查询缓存
query_cache_size 默认情况下query_cache_size为0,表示为查询缓存预留的内存为0,则无法使用查询缓存。
2、使用memcache缓存查询数据
获取:get(key)
设置:set(key,val,expire)
删除:delete(key)
3、使用redis缓存查询数据
与memcache的区别:
① 在做缓存时二者性能相差不大
② redis支持快照,AOF,依赖快照进行持久化
③ memcache不支持持久化,通常做缓存,提升性能
十、高并发的解决方法——数据库数据库的优化
参考 http://www.php.cn/blog/detail/10167.html