【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
/**
*
* 关于对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工具配合
完结了.......................................
*
*/
来源:oschina
链接:https://my.oschina.net/u/1246814/blog/275371