浏览器缓存实现原理

 
浏览器缓存将文件保存在客户端,好的缓存策略可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担。因此我们有必要了解它的实现原理,用来提高网站的性能。
当一个客户端请求web服务器, 请求的内容可以从以下几个地方获取:服务器、浏览器缓存中或缓存服务器中。这取决于服务器端输出的页面信息。页面文件有三种缓存状态。
1.最新的:选择不缓存页面,每次请求时都从服务器获取最新的内容。
2.未过期的:在给定的时间内缓存,如果用户刷新或页面过期则去服务器请求,否则将读取本地的缓存,这样可以提高浏览速度。
3.过期的:也就是陈旧的页面,当请求这个页面时,必须进行重新获取。

页面的缓存状态是由http header决定的,一个浏览器请求信息,一个是服务器响应信息。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。其中Pragma: no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1规定。

Cache-Control的主要参数

Cache-Control: private/public Public 响应会被缓存,并且在多用户间共享。 Private 响应只能够作为私有的缓存,不能再用户间共享。
Cache-Control: no-cache:不进行缓存
Cache-Control: max-age=x:缓存时间 以秒为单位
Cache-Control: must-revalidate:如果页面是过期的 则去服务器进行获取。

Expires:显示的设置页面过期时间
Last-Modified:请求对象最后一次的修改时间 用来判断缓存是否过期 通常由文件的时间信息产生
If-Modified-Since :客户端发送请求附带的信息 指浏览器缓存请求对象的最后修改日期 用来和服务器端的Last-Modified做比较

如IE的设置里面有四种方式(如图)的"每次访问页面检查",用户使用重新加载或超过了过期日期,浏览器就会认为这个页面是陈旧的(它将发送附加一个If - Modified-Since的信息. 如果页面没有改变,服务器端响应一个304状态 Not Modified,而不发送整个页面,这样就会很快,但服务器必须要生成有效的Last-Modified headers且服务器时间必须是有效的。



一个不进行缓存的服务器端响应

HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 19662
Pragma: no-cache
Cache-Control: no-cache
Server: Roxen/2.1.185
Accept-Ranges: bytes
Expires: Wed, 03 Jan 2001 00:18:55 GMT

有时候仅仅设置Pragma: no-cache Cache-Control: no-cache 还是不保险,需要将过期时间设置成过去的时间就确保了对象不被缓存。

一个允许缓存的服务器端响应

HTTP/1.1 200 OK
Date: Tue, 13 Feb 2001 14:50:31 GMT
Server: Apache/1.3.12
Cache-Control: max-age=43200
Expires: Wed, 14 Feb 2001 02:50:31 GMT
Last-Modified: Sun, 03 Dec 2000 23:52:56 GMT
ETag: "1cbf3-dfd-3a2adcd8"
Accept-Ranges: bytes
Content-Length: 3581
Connection: close
Content-Type: text/html

Cache-Control: max-age=43200 表示缓存12个小时

我们来看一个浏览器缓存的具体例子
第一次请求文件
Request:
GET /file.html HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-comet, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: 24.5.203.101
Connection: Keep-Alive

Response:
HTTP/1.1 200 OK
Date: Tue, 13 Feb 2001 20:00:22 GMT
Server: Apache
Cache-Control: max-age=604800
Last-Modified: Wed, 29 Nov 2000 15:28:38 GMT
ETag: "1df-28f1-3a2520a6"
Accept-Ranges: bytes
Content-Length: 10481
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

这里返回了Last-Modified和ETag,这两个信息就是用来以后比较当前浏览器缓存的文件是否和服务器端文件一致,如果不一直就获取最新,一直则读取本地缓存。

第二次请求
Request:
GET /file.html HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
If-Modified-Since: Wed, 29 Nov 2000 15:28:38 GMT
If-None-Match: "1df-28f1-3a2520a6"
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: 24.5.203.101
Connection: Keep-Alive

Response:
HTTP/1.1 304 Not Modified
Date: Tue, 13 Feb 2001 20:01:07 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
ETag: "1df-28f1-3a2520a6"
Cache-Control: max-age=604800

请求中的If-None-Match信息就是第一次响应的ETag,用来验证和当前响应的ETag是否一致。服务器返回Not Modified,浏览器就读取本地缓存。

我们还可以使用专门缓存服务器来改善性能。他的原理和浏览器的缓存原理一样,所有的浏览器请求将由缓存服务器响应,缓存服务器可以用自己的缓存文件或获取新的文件来响应用户的请求。因此有了缓存服务器的,将大大提高网站的性能。
参考文章:http://www.webperformance.org/caching/caching_for_performance.html Created by jecray

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 浏览器缓存是前端开发中常用的优化技术,它可以大大提高网页加载速度和降低服务器压力。 浏览器缓存的工作原理是将网页的静态资源,如图片、CSS、JavaScript等文件存储在浏览器本地,下次访问该网页时可以直接从本地缓存中读取,而不用再向服务器请求,从而大大减少了网络请求时间。 使用浏览器缓存需要在服务器端配置缓存控制,告诉浏览器该资源可以缓存多长时间。这通常是通过设置 HTTP 头部的 Expires 和 Cache-Control 字段来实现的。 注意,浏览器缓存并不适用于所有情况,特别是当网页的内容需要经常更新时,就不适合使用浏览器缓存。此时,应该在服务器端配置为不缓存,以保证用户每次都获取到最新的内容。 总之,浏览器缓存是前端开发中一个很有用的优化技巧,它可以提高网页加载速度并降低服务器压力,但也需要根据实际情况进行适当的使用。 ### 回答2: 浏览器缓存是前端开发中一个常见但又容易被忽视的重要概念。它可以显著提高网站的加载速度和用户体验。本文将向大家介绍浏览器缓存的基本原理、常见问题以及前端开发中常用的缓存控制方法。 首先,浏览器缓存是一种将已经下载过的资源保存在客户端的技术。当用户再次访问网站时,浏览器可以直接从本地缓存中加载资源,而无需重新下载,从而提高了网站的加载速度。浏览器缓存可以分为两种类型:强缓存和协商缓存。 强缓存是通过设置响应头中的Expires或Cache-Control字段来实现的。Expires字段指定了资源的过期时间,Cache-Control字段可以设置资源在浏览器缓存中存储的时间。当浏览器访问该资源时,在过期时间内,浏览器直接从缓存中加载资源,而不会发送请求到服务器。 协商缓存是通过设置响应头中的Last-Modified和ETag字段来实现的。Last-Modified表示资源的最后修改时间,ETag是资源的唯一标识符。当浏览器再次请求该资源时,会发送If-Modified-Since和If-None-Match字段,服务器会根据这些字段判断资源是否有更新。如果资源未被修改,服务器返回304状态码,浏览器直接从缓存中加载资源,否则服务器返回新的资源。 在前端开发中,我们可以通过使用版本号或者哈希值的方式来解决缓存问题。每当修改了资源文件时,我们可以将资源的链接中加入一个版本号或者哈希值,这样就可以保证每次资源文件发生变化后,链接的变化能够告知浏览器重新下载资源。另外,我们还可以使用工具或者服务器配置来对静态资源进行缓存控制,如使用Webpack的hash命名方式生成文件名,或者在Nginx配置文件中设置缓存时间。 总之,浏览器缓存是一种能够显著提高网站性能的技术。理解浏览器缓存原理和机制对于前端开发人员来说是非常重要的。通过合理设置缓存相关的响应头、采用合适的缓存策略以及使用版本号和哈希值等方式,我们可以有效控制和利用浏览器缓存,提高网站的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值