浏览器缓存初探

缓存一直是web开发中提高性能的一个不可或缺的方面。由于web开发的本质实质上就是浏览器和服务器通过HTTP协议进行通信的过程。因此,缓存也分为服务器端缓存和浏览器缓存。这里,我主要讨论一下浏览器缓存。

浏览器缓存的内容往往存储在浏览器本地,而内容则是由Web服务器生成,任何一方都不可能独立完成这一些列过程,所以,浏览器和服务器之间必须有一种沟通的机制,这种沟通机制被称为“缓存协商”。而浏览器正是通过与服务器的这种沟通机制来实现缓存的。

在HTTP 1.1中,存在着两种缓存协商机制:Last-Modified和ETag。

Last-Modified

Last-Modified的意思是最后的修改时间,Web服务器首先浏览器发送Last-Modified协议头,告诉浏览器发送内容的最后修改时间,当浏览器下次请求相同的URL时,会在请求头部中增加If-Modified-Since标记,标记的值为服务器上次传过来的Last-Modified的值,这以为着浏览器在询问Web服务器:“我请求的内容在这个时间之后是否有更新”。此时,服务器需要检查浏览器请求的内容在这个时间点之后是否有过更新,并犯规给浏览器。对于静态内容,Web服务器可以轻松搞定,而对于动态内容,检查是否有更新的工作需要交给动态程序自己去完成。

ETag

除了Last-Moidfied,HTTP1.1还支持ETag这种缓存协商方法。Etag是一串用来标记服务器需要发给浏览器的内容的编码,它是由Web服务器生成的。比如Apache服务器在发我那个一个静态文件给浏览器时在响应头中增加了一下标记:ETag:"74177-b-b452413c1bc0",浏览器在获得这个内容的ETag后,会在下次请求该内容时,在HTTP请求头中附加以下标记来询问服务器该内容是否发生变化:If-None-Match:"74177-b-b452413c1bc0"。这时服务器需要重新计算这个内容的ETag值,并与HTTP请求中的ETag进行比较,若相同则返回304状态码,若不同则发送新的内容给浏览器。需要注意的是HTTP1.1并没有规定ETag的具体格式和计算方法,因此,Web服务器可以自由定义ETag的格式和计算方法。

对比两种缓存协商方法,使用基于最后修改时间的缓存协商方法存在着一些不足。比如:当文件频繁更新,但内容却并没有改变时,如果采用Last-Modified缓存协商方法,那么每次文件的修改时间变化后,不管内容是否变化,浏览器都会重新获取全部内容。这时候,若直接是中ETag协商办法,则可以避免这些问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值