只要向浏览器输出过期时间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加速也采用硬件实现
例如,通过配置apache实现自身 cache
在这个领域百花齐放,相信你一定能找到适合你的。这些cache会为你提供一些api,来访问它。
代表性的 memcached 据我所是sina广泛使用,腾讯也曾经使用过后来开发了TC(Tencent Cache),台湾雅虎则使用APC Cache。
另外模板引擎也有自己的缓存系统
数据库本身就有这个配置选项,如果需要你仍然可以在数据库前面加一道Cache。
例如PostgreSQL, MySQL 都提供参数可以将memcached编译到它内部
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
Java学习的第二篇总结!——子类和父类 深入分析,希望大家多多支持!
从内存角度去分析代码,可以从本质上理解一门语言!
子类从父类继承分成两种:
1.方法的继承:
方法的继承,父类直接把自己的方法转移到子类中去,当然前提是父类的方法修饰符的访问范围是子类可以访问的范围,但是如果子类已经重写了父类的方法,这时候这个方法就不能重父类转移到子类中。
2.成员变量的继承 :
成员变量就会有点奇妙了,它不会从父类转移到子类,而是保留在父类中,这就会出现,子类和父类可能同时拥有两个相同名字的变量。
下面用一段代码来说明这种相对比较复杂的关系:
package com.text;
public class Test { public static void main(String[] args) { Father a = new Father(); Chilren b = new Chilren(); Father c = new Chilren(); a.getAge(); System.out.println(a.age); b.getAge(); System.out.println(b.age); c.getAge(); System.out.println(c.age); } } class Father { int age = 40; public void getAge() { System.out.println(age); } } class Chilren extends Father { int age = 18; public void getAge() { System.out.println(age); } }
输出
40 40 18 18 18 40
前四个结果可以理解,但是最后两个结果有人可能会问为什么结果会不一样,这段代码就体现了,成员变量继承和方法继承的区别。
可以得出结论:
Father c = new Chilren();
在以上父类引用指向子类对象情况下,访问变量看的是引用类型,所以c.age是父类的成员变量,而c.getAge()访问到的是子类Chilren的方法,所以在这个方法中用到的age变量是Chilren的变量
反正一句话,访问变量看声明,访问方法看实际对象类型(new出来的类型)
接下来对代码做部分修改
public static void main(String[] args) {
Chilren b = new Chilren(); Father c = b System.out.println(b.age); System.out.println(c.age); }
输出 18 40
b 和c 两个引用都是指向内存中同一个对象,但是打印出来的结果却是不同,这就说明了,内存中保存了两个 age的值,一个是18 一个是40 。
这里就会产生一些疑问,在内存中他们是怎么存储的?这时候会想到有个super关键字,通过super. 可以访问到父类的变量和方法,这里有人会说:“super.代表的就是一个父类对象,因为他指向父类” 之前我也是这么想,但是看过一些书后知道其实不是这样
其实super.不是“东西”,说道super.自然会想到this.,有人把他们归为同类,其实他们大大不同
this:是一个真真实实对象,代表的就是当前对象,可以用 return this; 去返回一个对象。
super:不能一个对象,不是指向父类对象的意思,super只是修饰了他后边的内容,告诉JVM,后面这部 分内容不是当前对象所属类的内容而已,若用return super,JVM是不允许的,是一种错误的语法。
Chilren b = new Chilren(); Father c = b
回归到上面这段代码,这里并不是说内存中有两个对象 b 和 c ,内存中其实就只有一个 b对象 ,只是c 不仅有自己的实例 变量,同时也存在父类所定义的全部实例变量。
所以可以得出结论:在实例化一个子类的同时,系统会给子类所有实例变量分配内存,也会给他的父类的实例变量分配内存,及时父子类中存在重名的实例变量,也会两个都分配内存的,这个时候子类只是隐藏了父类的这个变量,但还是会给它分配内存,然后可以用super来访问属于父类的变量。
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
在不同的网络环境间切换时需要手动修改IP和IE代理设置,较为繁琐,可以通过编写相应的bat批处理脚本自动完成配置,做到一键切换。以下是一个示例:
@echo off echo set ip... netsh interface ip set address name="本地连接" source=static addr=xxx.xxx.xxx.xxx mask=xxx.xxx.xxx.xxx echo set gateway.... netsh interface ip set address name="本地连接" source=static gateway=xxx.xxx.xxx.xxx gwmetric=1 echo set IE proxy: proxy.sony.com.cn:8080... reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "xxx.xxx.xxx.xxx:80" /f reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyOverride /t REG_SZ /d "" /f echo flash... ipconfig /flushdns
其中xxx.xxx.xxx.xxx为对应属性的IP。如第11行中的"xxx.xxx.xxx.xxx:80"为目标代理服务器的IP和端口(80),两者都可以根据自己的环境修改。