提到缓存,一般都会想起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的几篇参考资料:
使用ETags减少Web应用带宽和负载
Etag与HTTP缓存机制
http://www.iteye.com/topic/656658 HTTP协议缓存策略深入详解之etag妙用
标签:缓存,HTTP,since,modified,Etag,服务器,客户端 From: https://blog.51cto.com/u_6978506/7470422