首先要说明,很多缓存技术依赖静态化。下面展示了缓存可能出现的位置。
用户user -> 浏览器缓存 IE/Firefox Cache -> 逆向代理缓存 Reverse proxy Cache -> WEB服务器缓存 Apache cache -> 应用程序缓存 php cache -> 数据库缓存 database cache
当然交换机,网络适配器,硬盘上也有Cache 但这不是我们要讨论的范围。
缓存存储方式主要是内存和文件两种,后者是存于硬盘中。
网站上使用的缓存主要包括五种:
-
浏览器 缓存
-
逆向代理/CDN缓存
-
WEB服务器缓存
-
应用程序缓存
-
数据库缓存
将上面的缓存合理地,有选择性的使用可大大提高网站的访问能力。
总之,想让你的网站更快,更多并发,答案是cache,cache 再 cache
只要向浏览器输出过期时间HTTP协议头,不论是html还是动态脚本,都能被缓存。
HTML META
<meta http-equive="Expires" content=" Mon, 10 Jan 2000 00:00:00 GMT"/> <meta http-equive="Cache-Control" content="max-age=300"/> <meta http-equive="Cache-Control" content="no-cache"/>
动态脚本
Expires: Mon, 10 Jan 2000 00:00:00 GMT Cache-Control: max-age=300 Cache-Control: no-cache header("Expires: " .gmdate ("D, d M Y H:i:s", time() + 3600 * 24 * 7). " GMT"); header("Cache-Control: max-age=300"); header("Cache-Control: no-cache");
很多web server都提供 Expires 模块
提示 | |
---|---|
有些浏览器可能不支持。 |
If-Modified-Since 小于 Last-Modified 返回 200
neo@neo-OptiPlex-780:/tmp$ curl -I http://www.163.com/ HTTP/1.1 200 OK Server: nginx Content-Type: text/html; charset=GBK Transfer-Encoding: chunked Vary: Accept-Encoding Expires: Mon, 16 May 2011 08:12:05 GMT Cache-Control: max-age=80 Vary: User-Agent Vary: Accept Age: 38 X-Via: 1.1 ls100:8106 (Cdn Cache Server V2.0), 1.1 lydx156:8106 (Cdn Cache Server V2.0) Connection: keep-alive Date: Mon, 16 May 2011 08:11:23 GMT
If-Modified-Since 大于 Last-Modified 返回 304
neo@neo-OptiPlex-780:/tmp$ curl -H "If-Modified-Since: Fri, 12 May 2012 18:53:33 GMT" -I http://www.163.com/ HTTP/1.0 304 Not Modified Content-Type: text/html; charset=GBK Cache-Control: max-age=80 Age: 41 X-Via: 1.0 ls119:80 (Cdn Cache Server V2.0), 1.0 lydx154:8106 (Cdn Cache Server V2.0) Connection: keep-alive Date: Mon, 16 May 2011 08:11:14 GMT Expires: Mon, 16 May 2011 08:11:14 GMT
neo@neo-OptiPlex-780:/tmp$ curl -I http://images.example.com/test/test.html HTTP/1.1 200 OK Cache-Control: s-maxage=7200, max-age=900 Expires: Mon, 16 May 2011 09:48:45 GMT Content-Type: text/html Accept-Ranges: bytes ETag: "1984705864" Last-Modified: Mon, 16 May 2011 09:01:07 GMT Content-Length: 22 Date: Mon, 16 May 2011 09:33:45 GMT Server: lighttpd/1.4.26
neo@neo-OptiPlex-780:/tmp$ curl -H 'If-None-Match: "1984705864"' -I http://images.example.com/test/test.html HTTP/1.1 304 Not Modified Cache-Control: s-maxage=7200, max-age=900 Expires: Mon, 16 May 2011 09:48:32 GMT Content-Type: text/html Accept-Ranges: bytes ETag: "1984705864" Last-Modified: Mon, 16 May 2011 09:01:07 GMT Date: Mon, 16 May 2011 09:33:32 GMT Server: lighttpd/1.4.26
具有代表性的逆向代理服务器:
-
Squid
-
Nginx
-
Varnish
-
Apache cache module
其它逆向代理服务器
-
一些提供cache的硬件设备
-
最近几年出现了的 China Cache 服务商,也称CDN
很多CDN厂商使用Squid 二次开发做为CDN节点,通过全球负载均衡使用分发
这些CDN厂商主要做了一下二次开发
-
logs 日志集中
-
流量限制
-
push,pull操作
-
url 刷新
s-maxage 与 max-age用法类似,s-maxage针对代理服务器缓存。同样适用于CDN
s-maxage 与 max-age 组合使用可以提高CDN性能
F5 Big-IP, Array 等设备都提供硬件加速,其原理与squid, apache提供的功能大同小异
其中Array 页面压缩采用硬件压缩卡实现,SSL加速也采用硬件实现
在这个领域百花齐放,相信你一定能找到适合你的。这些cache会为你提供一些api,来访问它。
代表性的 memcached 据我所是sina广泛使用,腾讯也曾经使用过后来开发了TC(Tencent Cache),台湾雅虎则使用APC Cache。
另外模板引擎也有自己的缓存系统
原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。