为了能够给用户一个良好的上网体验,大部分的网页和浏览器都配置了预加载以及缓存功能。
今天甘肃电脑培训http://www.kmbdqn.cn/就通过案例分析来了解一下,关于web缓存的基本定义与类型介绍。
Web缓存是什么?为什么要使用缓存?Web缓存处于服务器(也称为源服务器)和客户端之间,监视请求并保存响应的副本,比如HTML页面,图片和文件等(统称为表述)。
如果之后有对同一个URL的新请求,它会使用自己保存的内容来响应,而不是再次请求源服务器来获取内容。
使用Web缓存主要有下面两个原因:减少延迟——因为响应请求的内容来自缓存(距客户端较近)而不是源服务器,它会花较少的时间来获得表述并将他们呈现出来。
这使得Web看起来具有良好的响应速度。
减少网络传输——由于复用了表述,它可以减少客户端使用的带宽总量。
如果客户需要为流量付费,这就意味着省钱。
缓存会降低对带宽的要求,也降低处理难度。
Web缓存的种类浏览器缓存你在查看现代Web浏览器(比如IE、Safari或Mazilla)选项的时候,可能会看到“缓存”设置。
这个选项让你配置一部分硬盘空间来保存你看过的表述。
浏览器缓存的规则相当简单。
它通常会在一次会话(即当前浏览器中一次调用)中检查表述是否新。
这个缓存在用户使用“回退”按钮或者点击一个浏览过的链接时会特别有用。
而且,如果你在网站的各个页面中浏览相同的图片,他们几乎能马上从缓存中加载出来。
代理缓存Web代理缓存的工作原理相同,但规模更大。
代理以同样的方式为成百上千的用户服务大公司和ISP常常把代码缓存建立在防火墙之上,也可能是以独立设备的形式存在(也称为中间设备)。
代理缓存即不是客户端的一部分,也不是服务器的一部分,而是在网络之外,必须以某种方式把请求路由过去。
其中一种方式是手工修改浏览器代理设备,指定要使用的代码另一种方式是拦截。
拦截式代理会根据其自身的基础网络重定向Web请求,不需要在客户端配置,客户端甚至不知道它们的存在。
代理缓存是一种共享缓存,通常不只是一个用户,而是大量用户在使用代理缓存。
正因为如此,他们特别擅长降低延迟和网络传输量。
这是因为众人都需要的表述会被多次重复使用。
网关缓存网关缓存又名“反向代理缓存”或“替代缓存”。
网关缓存也是一种中介,它他们不是由网络管理员部署以节约带宽,而是由网站管理员自己部署,使其站点更具伸缩性、可靠性以及拥有更好的性能。
很多方法都可以把请求路由到网关缓存,但常见的方法是使用负载均衡器让他们对于客户来说,看起来就跟源服务器一样。
内容分发网络(CDN)在整个Internet(或它的一部分)中分发网关缓存,并将其出售给对此感兴趣的网站。
Web缓存对我有坏处么?我为什么要帮助它们?Web缓存是互联网中误解深的技术之一。
因为代理缓存可以隐藏使用网站的用户,所以网站管理员特别害怕失去对他们的站点的控制,这会使得他们很难去知道是谁在使用他们的站点。
然而不幸的是,即使没有Web缓存,网络上也有非常多的因素可以保证管理员精确的知道一个用户如何使用他们的站点。
如果这是你非常关注的问题的话,这篇手册将会指导你如何在站点没有不友好的缓存机制的情况下获取你需要的统计信息。
一、浏览器缓存浏览器缓存即http缓存;浏览器缓存根据是否需要向服务器重新发起HTTP请求将缓存过程分为两个部分,分别是 强制缓存 和 协商缓存 。浏览器第一次请求资源的时候服务器会告诉客户端是否应该缓存资源,根据响应报文中HTTP头的缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存入浏览器缓存中。如下图:1.强制缓存 :浏览器会对缓存进行查找,并根据一定的规则确定是否使用缓存。 强制缓存的缓存规则? HTTP/1.0 Expires 这个字段是绝对时间,比如2018年6月30日12:30,然后在这个时间点之前的请求都会使用浏览器缓存,除非清除了缓存。 这个字段的缺点就是只会同步客户端的时间,这就有可能修改客户端时间导致缓存失效。 HTTP/1.1 cache-Control 这个是1.1的时候替换Expires的,它会有几种取值:public :所有内容都将被缓存(客户端和代理服务器都可缓存)private :所有内容只有客户端可以缓存, Cache-Control的默认取值 no-cache :客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定no-store :所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存max-age=xxx (xxx is numeric) :缓存内容将在xxx秒后失效 比如max-age=500,则在500秒内再次请求会直接只用缓存。 优先性:cache-Control >Expires 如果同时存在,cache-Control会覆盖Expires。 这个字段的缺点就是: 如果资源更新的速度是秒以下单位,那么该缓存是不能被使用的,因为它的时间单位最低是秒。 如果文件是通过服务器动态生成的,那么该方法的更新时间永远是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用。上图中浏览器缓存中存在该资源的缓存结果,并且没有失效,就会直接使用缓存的内容。上图中浏览器缓存中没有该资源的缓存结果和标识,就会直接向服务器发起HTTP请求。2.协商缓存: 浏览器的强制缓存失效后(时间过期),浏览器携带缓存标识请求服务器,由服务器决定是否使用缓存。 服务器决定的规则? 控制协商缓存的字段有 Last-Modified / If-Modified-Since 和 Etag / If-None-Match。 ①Last-Modified 是服务器返回给浏览器的本资源的最后修改时间。 当下次再次请求的时候,浏览器会在请求头中带 If-Modified-Since ,即上次请求下来的 Last-Modified 的值, 然后服务器会用这个值和该资源最后修改的时间比较,如果最后修改时间大于这个值,则会重新请求该资源,返回状态码200。 如果这个值和最后修改时间相等,则会返回304,告诉浏览器继续使用缓存。 ② Etag 是服务器返回的一个hash值。 当下次再次请求的时候,浏览器会在请求头中带 If-None-Match ,即上次请求下来的 Etag 值, 然后服务器会用这个值和该资源在服务器的 Etag 值比较,如果一致则会返回304,继续使用缓存;如果不一致,则会重新请求,返回200。二、服务器缓存 上面是一个简单的流程图: 用户1访问A页面,服务器解析A页面返回给用户1,同时在服务器内存上做一定映射,把A页面缓存在硬盘上面 用户2访问A页面,服务器直接根据内存上的映射找到对应的页面缓存,直接返回给用户2,这样就减少了服务器对同一页面的重复解析 服务器缓存和浏览器缓存的区别: 服务器缓存是把页面缓存到服务器上的硬盘里,而浏览器缓存是把页面缓存到用户自己的电脑里Nginx服务器 Nginx是一个高性能的HTTP和反向代理服务器。具有非常多的优越性: 在连接高并发的情况下,Nginx是Apache服务器不错的替代品,Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。 Nginx提供了expires、etag、if-modified-since指令来实现浏览器缓存控制。nginx -s reload#重新加载配置文件 nginx -s reopen#重新打开log文件 nginx -s stop#快速关闭nginx服务 nginx -s quit #优雅的关闭nginx服务,等待工作进程处理完所有的请求Nginx设置静态文件的缓存过期时间 location ~.*\.(js|css|html|png|jpg)$ { expires 3d } expires 3d//表示缓存3天 expires 3h//表示缓存3小时 expires max//表示缓存10年 expires -1//表示永远过期。 如果设置为-1在js、css等静态文件在没有修改的情况下返回的是http 304,如果修改返回http 200 对于静态资源会自动添加ETag,可以通过添加etag off指令禁止生成ETag。如果是静态文件,那么Last-Modified值为文件的最后修改时间。在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存或者强制刷新来测试的烦恼,提供下apache不缓存配置和nginx不缓存配置的设置。在常用的缓存设置里面有两种方式,都是使用add_header来设置:分别为Cache-Control和Pragma。 location ~ .*\.(css|js|swf|php|htm|html )$ { add_header Cache-Control no-store add_header Pragma no-cache }nginx gzip压缩使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。 主要在nginx服务端将页面进行压缩,然后在浏览器端进行解压和解析, 目前大多数流行的浏览器都迟滞gzip格式的压缩,所以不用担心。 默认情况下,Nginx的gzip压缩是关闭的,同时,Nginx默认只对text/html进行压缩gzip onersio #开启gzip压缩输出gzip_http_vn 1.0 #默认1.1 #其中的gzip_http_version的设置,它的默认值是1.1,就是说对HTTP/1.1协议的请求才会进行gzip压缩 #如果我们使用了proxy_pass进行反向代理,那么nginx和后端的upstream server之间是用HTTP/1.0协议通信的。gzip_vary on #和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持, #所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩gzip_comp_level 6 #设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大 1-9gzip_proxied any #Ngnix作为反向代理的时候启用#expample:gzip_proxied no-cache # off – 关闭所有的代理结果数据压缩 # expired – 启用压缩,如果header中包含”Expires”头信息 # no-cache – 启用压缩,如果header中包含”Cache-Control:no-cache”头信息 # no-store – 启用压缩,如果header中包含”Cache-Control:no-store”头信息 # private – 启用压缩,如果header中包含”Cache-Control:private”头信息 # no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息 # no_etag – 启用压缩,如果header中包含“ETag”头信息 # auth – 启用压缩,如果header中包含“Authorization”头信息 # any – 无条件压缩所有结果数据gzip_types text/html #压缩的文件类型 #设置需要压缩的MIME类型,非设置值不进行压缩 #param:text/html|application/x-javascript|text/css|application/xmlgzip_buffers 16 8k#设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间 #设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间 # param1:int 增加的倍数 # param2:int(k) 后面单位是k # example: gzip_buffers 4 8k # Disable gzip for certain browsers.gzip_disable “MSIE [1-6].(?!.*SV1)”#ie6不支持gzip,需要禁用掉ie6浏览器缓存有两种:强制缓存和协商缓存
向浏览器缓存中查找请求结果,根据【缓存规则】决定是否使用该结果。
强制缓存失效后,携带缓存标识请求服务器,服务器根据缓存标识判断是否使用缓存
当浏览器向服务器发送请求的时候,服务器会将缓存规则放入HTTP响应的报文的HTTP头中和请求结果一起返回给浏览器(ps:下文说的时间点均为类似:Sat Aug 14 2021 11:01:52,秒级)
两个字段:Expires和Cache-Control,优先级:Cache-Control >Expires,客户端比较时间
Expires :HTTP/1.0,返回值为【到期时间点】,再次请求,客户端的时间<Expires,直接用缓存(ps:客户端与服务器端时间可能存在误差,出问题)
Cache-Control :HTTP/1.1,有以下字段
Last-Modified / If-Modified-Since 和 Etag / If-None-Match,优先级Etag >Last-Modified,服务器比较时间
Last-Modified(服务端返回客户端) / If-Modified-Since(客户端传入服务端) :两个值相同,表示:资源文件在服务器最后被修改的时间【时间点】。
Etag(服务端返回客户端) / If-None-Match(客户端传入服务端) ,两个值相同,为当前资源文件的一个唯一标识(由服务器生成)
Etag什么时候用
雅虎禁用了Etag:因为ETag的值和服务器有关,那么对于同样的文件,可能下次请求的时候是发给不同的服务器,结果也会重新发送数据,所以就会影响网页加载速度,增加服务器的压力(但Last-Modified也与服务器有关)
主要解决的问题:
浏览器的每个tab都是一个进程
两个缓存的地方 from memory cache(内存缓存) 和 from disk cache(硬盘缓存) ,读取顺序为memory >disk
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)