基于HTTP协议的客户端缓存

提到缓存,一般都会想起redis、memcached等分布式缓存系统。虽然使用这些服务器端缓存速度能提升不少,但其实还是需要客户端下载这部分数据,目前在移动互联网领域,节省流量是很有必要的,因此工作中也就需要加入客户端缓存的相关技术。

怎么使用客户端缓存?

1、用http报头中的last-modified和if-modified-since属性:

客户端请求某个URL的页面时,服务器响应200的同时会下发一个last-modified属性表明请求页面的最后更新时间。

客户端再次请求服务器时,根据http协议会在报头添加if-modified-since属性,询问请求页面是否被更新过。

如果服务器端没有更新过请求的页面,则自动响应http 304(not changed)状态码,而响应的Body为空,从而减少了数据传输。

如果服务器更新过了请求的页面,则会将最新的数据响应给客户端。

因此,只要客户端将第一次服务器响应的数据和last-modified在本地存起来,以后的请求在if-modified-since中使用原先存储的时间,如果遇到了响应http 304就直接读本地存储的数据,如果不是304就及时更新本地存储的数据就行了。这样能比每次请求都拉取数据要节省很多流量。

2、关于Etag:

Etag主要为了解决last-modified无法解决的一些问题。

(1)一些文件的内容并不改变,仅仅改变修改时间。

(2)文件在1s内修改了N次,if-modified-since能检查到的粒度是秒级的,这种修改无法判断。

(3)服务器不能精确的得到文件的最后修改时间;

与last-modified类似:

首先,客户端第一次请求时,服务器计算好etag并返回给客户端。客户端保存etag信息和响应数据,再次发送请求时发一个If-None-Match头,并包含上次服务器响应的etag值。

其次,服务器判断发送过来的Etag和计算出来的Etag匹配,如果If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存;

如果同时使用if-modified-since和If-None-Match,会在完全匹配if-modified-since和If-None-Match之后,服务器才能返回304。

关于Etag的几篇参考资料:

http://www.infoq.com/cn/articles/etags 使用ETags减少Web应用带宽和负载

http://blog.csdn.net/kikikind/article/details/6266101  Etag与HTTP缓存机制

相关推荐