文档章节

高性能--web服务器缓存 (2)

小洋哥
 小洋哥
发布于 2014/06/07 04:02
字数 3073
阅读 154
收藏 0

   /**
     *
     *    关于对web服务器缓存(控制期)
     *
     *                                        
                1.web缓存对静态还是动态内容的过期检查
                可能大家对我在上一章中讲到,内容与HTTP头分开存储的, http头中  标记就是判断过期检查的其实就是建立在http协议上的


                举例PHP脚本:  如果要为一个动态内容指定有效期。
                仍然要在 Http响应头中追加Expires标记,如果你对这个动态内容不要这个动态内容缓存的话,那么最简单的办法就是让

                header("Expires: 0");

                这样web服务器就不会把这个动态内容发到缓存区
                Look下面代码:

                *
                **/


                $mod_time = $_SERVER['HTTP_IF_MODIFIED_SINCE'];


                if (strtotime($mod_time) + 20 > time()) {

                 header("HTTP/1.1  304");

                 exit();
                }

                header("Last-Modified:".gmdate("D, d M Y H:i:s")."GMT");

                header("Cache-Control: max-age=10");

                echo  time();

                /**
                *              关闭服务器磁盘缓存, 那么上面代码每到20秒才到服务器去取数据(这个代                  码应该不需要我讲吧)
                *
                *
                现在我开启服务器缓存后,这就意味着刘谦器与动态内容之间
                增加了一块缓存区
                我们现在不断刷新,其结果也刚才是一样的
                说白了就是 咱们的意思就是20后去请求原程序。

                1.Last-Modified ,如果动态内容HTTP协议的头中包含了,Last-Modified ,那么web服务器缓存区的最大默认时间就是这个


                2.配置mod_cache:(手册可见)

                cacheMaxExpire   3600

                这样 web  服务器便可以在日后与Last-Modified的时间进行比较, 判断内容是否过期

                如果动态内容中没有Last-Modified,
                处理方式就是另一个配置
                CacheIgnoreNoLastMod   如果开启那么动态内容将不会被缓存。

                如果没有last-Modified与Expires,那么缓存区就不会缓存他。

                这里有个问题,上一章我们test的时候就没这两个为啥就缓存了。这是个问题?

                其实啊CacheIgnoreNoLastMod 使用它的默认设置 ,就是关闭,缓存区就会记录当当前时间为If-Modified ,并其为最大缓存时间
                本来Apache mod_cache的配置
                CacheIgnoreNoLastMod  这东西就关闭的


                另外就是,如果有些特定的内容不需要缓存,
                比如用户登录后成功生成的包含了登录状态的Cookie,这东西肯定不能缓存涩

                就是要跳过Web缓存区,虽然我们可以采用将
                header("Expires: 0"); 让他不缓存,
                但是还有其他办法,所以这东西要看手册你才能知道的

                Mod_cache提供了:
                CacheIgnoreHeaders  Set-Cookie
                上面的意思就是 凡是要创建浏览器Cookie的内容,都可以跳过缓存区,


                其实说真的,有时候,我时候很迷糊的,
                为啥?
                有些时候程序自身实现的页面缓存(很多框架都有内置的缓存机制)有些时候其实就是多余的,

                原因很简单程序真正运行到那里去的时候,其实也走过了,浏览器缓存,
                web服务器缓存 比如反向代理缓存......  然后才会到框架还是我们自己写的缓存系统,难得你不觉得多余么?

                而且直接告诉浏览器一个 Expires就可以解决问题了。

                说起来,如果实现一个基于Http缓存机制的话,这比较错呢
                如果是基于HTTP的缓存机制,那么扩展性很好,  即使换一台服务器,
                也可以使用反向代理来快速对接。

                我说这些,其实说白了,这种缓存机制的本质就 以URL为主键的Key->value的结构缓存
                所以我们必须要保证所以缓存的动态内容都是唯一的Url,
                比如你可以根据Http请求头中标记来输出不同的内容。你也可以把一些标记放到Url参数中,保证URl的唯一性就可以
                我有时候突然发现自己想实现的东西太了,但是时间也真是不等人呢,每天都忙的半死,              
                静态内容与动态内容的缓存管理,已经完毕


                顺便再提一下缓存”文件描述符号“ 这是只是讨论一下(不要太当真的)

                开发经验比较多的朋友应该知道如果平台的的小文件过多,这样会造成IO开销比较高,
                说白了就是磁盘寻址的问题,所以web服务器一大部分的开销都花在这里的,(闲扯,Lnux上很多小工具非常的不错,里面有追踪工具(strace工具),这工具很厉害,比如我去磁盘目录中打开一个文件,这个磁盘目录中文件多的吓人。
                你用一个追踪工具可以看Open()开打文件的系统的调用情况与时间,你就会明白我说的了,
                如果有这样情况如果你的磁盘有比较好目录结构的话,
                说了吧就不要把很多小文件都放在一个目录下
                有结构分,比以年月日分 等等........

                如果是这样的目录结构打开文件,用工具看一下,效果会好很多的,但是还是很蛋疼,
                我说的流量大web平台
                )
                所以很多人会选择把类似Sesseion这些类的小文件放到Memche中,这种选择其实是很对的,但是还想说一个东西
                Apache的文件描述符号,其实来说呢,也没啥好处,但是我想提一下,

                说到这里我想先回答一个朋友的问题 再说:,

                问题:关于Apace磁盘缓存引擎与内存缓存引擎
                其实很多朋友都会想,Apache为啥官方推荐我们用磁盘缓存,不用他们的内存缓存呢?
                关于多进程下内存共享问题 的开销大,这个不说,简单来说我没看过源码,也看不了源码,
                说不了只是Apache社区上的有些开发者这么说的吧,我没有发言权利。

                但有个问题是。他们官方竟然说我这个磁盘缓存系统不比存储在内存中的慢,
                而且据说还比内存缓存快呢,这一下把我们脑海中内存比磁盘快的观念给有点打破了
                其实来说磁盘确实肯定比内存慢,这点没啥说的,
                他说了2点
                1.我们多进程共享缓冲区
                2.内存映射
                内存映射
                我想专门说一下内存映射问题,其实也就是说理论吧

                大家对Linux研究比较深的人,本人除外哈,除了喜欢看一些破书的角色而已。
                应该知道Linux内核提供一种可以访问磁盘文件的特殊方式,
                它可以将内存中地址和我们要访问的磁盘文件进行关联,
                从而把我对这块内存的访问转换为对磁盘的访问  这东西就叫内存映射技术

                我大家应该能大体明白啥子是内存映射了吧,继续:

                使用内存映射可以提高I/O的性能,他无需使用read()或者write函数等系统函数来访问文件,而是通过mmap()系统函数来建立内存与磁盘文件的关联关系,然后像访问内存一样自由的访问文件。

                同志现在明白了不,继续:

                内存映射分类:
                1.共享型
                2.私有型

                1.共享型,可以将任何对内存的写操作同步到磁盘文件中,
                多个进程都共享任意一个进程对映入内存的修改,
                这个里有个问题就是多进程安全的问题,
                其实可以简单理解为多线程安全问题类似
                一个文件被多个进程映射,那么有需要有同步机制来控制
                这里就有了开销,这样效率就低了

                2.私有性
                他映射的文件只能是读类型文件,所有不会把对内存的写操作
                同步上文件上,而且多个进程不共享修改。


                再来接受一个工具,strace 工具

                在Apache2.0以上都使用了内存的映射的,  

                比如我访问一个小的静态页面,大概200字节  Url:http:/loachost/zb/x/xs/index.html

                apache会选用使用内存映射来读取,
                用 strace 工具追踪 Apache子进程的话,你就发现问题的
                本机没有strace工具没这工具,
                但是我可以大体说一下他调用函数流程

                1. Open("/zb/x/xs/index.html",常量|常量) //打开函数
                2.mmap2(xxx); //映射函数  mmap2是对mmap()函数的扩展,原理一样
                3.writev(xxxxxxxx) ;  //这个函数主要是不把http响应头的信息与 200字节的正文合并,
                并发送到浏览器端,说白了这函数就 就是浏览器接受到Http协议的响应头与内容
                4.munmap();//撤销映射,

                子程序大体就做这几步,你可以用工具追踪一下,一追便知


                顺便再提一个东西,直接I/O这东西,其实本质上给内存映射没多大差别的

                顺便再说一个在I/O操作中,就以java来,但是点到即止哈,
                I/O操作是是不是有一个缓冲区的的概念呢 写buffer  读buffer  StringBuffer  xxxbuffer 对象呢?。
                我保证你去看一下jdk手册保证mmap都有

                其实mysql 的有个Innodb_flush_method ,可以配置innodb支持I/o直接访问的,

                跑题了,继续说 文件描述符号


                由于有大量的小文件,即调用Open系统函数,所有我们可以直接
                考虑将打开后的文件描述缓存到 web服务器内存中,
                这个只能存在本机内存中,因为他描述的是本机上的文件资源,

                Apache提供一个 扩展   mod_file_cache

                我直接贴手册上的,

                Apache模块 mod_file_cache
                说明 提供文件描述符缓存支持,从而提高Apache性能
                状态 实验(X)
                模块名 file_cache_module
                源文件 mod_file_cache.c

                他应该是处于试验阶段的,但是也可以用

                配置:  还是用上面的有Url吧

                CacheFile   /zb/x/xs/index.htm


                但是缓存文件描述符方案只适合与静态文件
                如果有对这些文件的请求,Apache将通过文件描述直接发送出去
                如果是很多的话,只是写正则模糊匹配就行了手册有

                还要重点指出的是:,
                只要配置了,Apache在启动时就会 打开这些文件
                并持续到 Apache关闭为止,有些朋友肯定想到了,如果开启Apache就意味着要打开很多文件的话,那么内存这块肯定会带来很多内存开销,
                还有就是文件更新的话,必须要重启Apache才有效哈,
                缓存文件描述符对于较大的文件来不适用,
                如果是大文件的话,消耗只会是在传送中,而不是在Open,
                听起来挺没用的噶
                我相信有些站点是可以用的,只是我还没用过吧,毕竟咱们了解他的原理,
                说不定那天还真能用呢,其实这个缓存文件描述符思想挺好的
                我建议可以ab工具测试一下配置前后差别与strace工具配合
                完结了.......................................
                *
                */






© 著作权归作者所有

共有 人打赏支持
小洋哥
粉丝 22
博文 73
码字总数 39565
作品 0
成都
程序员
服务器后端开发系列——《实战Nginx高性能Web服务器》

1、高性能Web服务器Nginx的配置与部署研究(1)Nginx简介及入门示例 内容:概述Nginx的背景知识和简单的入门实例。 2、高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置与部署及“...

晨曦之光
2012/04/24
162
0
LAMP网站架构分析

转自:http://www.williamlong.info/archives/1908.html LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网 络服务器,MySQL数据库,P...

长征4号
2017/07/05
0
0
认识IO的问题才能更好的设计和开发出高并发和高性能的系统

【IO的概述】 计算机中的IO,主要是本地磁盘IO和网络IO。 下面是关于IO速度的几个基本知识。 网络IO肯定是本地最快,局域网次之,跨机房、跨城市、跨运营商会变慢。 局域网的传输速度比SSD卡...

一凡Sir
05/28
0
0
高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式

本文来自:CSDN博客专栏《Nginx高性能Web服务器》 及Poechant技术博客,转载请注明出处。 通过《高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景》一...

晨曦之光
2012/04/24
250
0
网站设计提纲

高性能(响应时间,并发数,TPS) 浏览器静态资源缓存 CDN缓存 反向代理服务器缓存 应用服务器本地缓存 分布式缓存服务器(Redis) 缓存数据预热 减少http请求(合并js,css,图片) http静态资...

fifadxj
2016/08/05
12
0

没有更多内容

加载失败,请刷新页面

加载更多

20.27 分发系统介绍~ 20.30 expect脚本传递参数

分发系统介绍分发系统-expect讲解(也就是一个分发的脚本)场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因...

洗香香
21分钟前
1
0
设计一个百万级的消息推送系统

前言 首先迟到的祝大家中秋快乐。 最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。 鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两...

crossoverJie
27分钟前
1
0
软件架构:5种你应该知道的模式

Singleton(单例模式)、仓储模式(repository)、工厂模式(factory)、建造者模式(builder)、装饰模式(decorator)……大概每个上课听讲的程序员都不会陌生——软件的设计模式为我们提供...

好雨云帮
39分钟前
2
0
OSChina 周二乱弹 —— 这只是一笔金钱交易

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《暮春秋色》- 窦唯 / 译乐队 《暮春秋色》- 窦唯 / 译乐队 手机党少年们想听歌,请使劲儿戳(这里) @我没有抓狂:跨服聊...

小小编辑
50分钟前
516
16
df命令、du命令 、磁盘分区

9月25日任务 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 4.1、命令 :df #磁盘空间使用情况 [root@zgxlinux-02 ~]# df 按字节显示 1000Byte=1KB 1000KB=1MB 1000MB=1GB ...

zgxlinux
58分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部