浏览器专题系列 - 缓存机制(二)

简介: 浏览器专题系列 - 缓存机制(二)

缓存策略


  • 强缓存
  • 协商缓存

优先级较高的是强缓存,当强缓存失效的情况下,才会走协商缓存流程

都是通过设置 HTTP Header 来实现的


强缓存

特点


  1. 不会向服务器发送网络请求,直接从缓存中读取资源
  2. 请求返回200的状态码
  3. 在devtools的network选项卡可以看到size显示from disk cache或from memory cache


设置方法


通过两种 HTTP Header 实现

  • Expires
  • Cache-Control


二者区别


  1. Expires 是RFC 2616(HTTP/1.0)协议中和网页缓存相关字段
  2. Cache-Control 是HTTP/1.1 中实现缓存机制的指令
  3. Cache-Control优先级高于Expires


Expires


使用举例:

Expires : Wed Mar 04 2020 13:33:10 GMT


用来指定资源的到期时间,表示资源在

  • 这个时间之前无需发起网络请求,直接使用缓存的资源
  • 这个时间之后失效,需要重新发起网络请求获取

缺陷: 受限制与本地时间,可以通过修改本地时间致其失效


Cache-Control


使用举例:

Cache-control: max-age=30


表示资源会在 30 秒后过期,需要再次请求,max-age是距离请求发起的时间的秒数

Cache-Control 生于 HTTP/1.1,优先级高于 Expires 。


可以在请求头或者响应头中设置,并且可以组合使用多种指令


常见指令


指令 作用
public 响应可以被服务端或者客户顿缓存
private 默认值 响应只可以被客户端缓存
max-age=30 缓存30s后过期需要重新请求
s-maxage=30 覆盖max-age,作用一致,代理服务器才生效
no-store 不缓存任何响应
no-cache 资源能被缓存,但立即失效
max-stale=30 30s内,即使缓存过期也使用该缓存
min-fresh=30 希望30s内获取最新的响应


网络异常,图片无法展示
|

特点 优先级高于Expires,指令可以组合


协商缓存


协商缓存就是强缓存失效后,浏览器携带资源的缓存标识向服务器发起请求,由服务器根据缓存标识决定是否继续使用缓存的过程


当浏览器发起请求验证资源时,如果资源没有做改变,那么服务端就会返回 304 状态码,并且更新浏览器现有缓存有效期


网络异常,图片无法展示
|


当资源失效时,返回 200 状态码和最新的资源


网络异常,图片无法展示
|


协商缓存可以通过设置两种 HTTP Header实现

  • Last-Modified
  • ETag


Last-Modified


浏览器发起请求访问目标资源,服务器在返回资源的同时,会在response header中添加 Last-Modified这个header,表示这个资源在服务器上的最后修改时间


浏览器下一次请求这个资源,浏览器检测到有 Last-Modified这个header,于是会添加If-Modified-Since这个header其值就是Last-Modified中的值


服务器再次收到这个资源请求,会根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比


  • 若服务器的资源最后被修改时间不等于于If-Modified-Since中的值的话就会将新的资源发送回来
  • 否则返回 304 状态码


缺点:


  • 如果本地打开缓存文件,即使没有对文件进行修改,但还是会造成 Last-Modified 被修改,服务端不能命中缓存导致发送相同的资源
  • Last-Modified 只能以秒计时,如果在不可感知的时间内修改完成文件,那么服务端会认为资源还是命中了,不会返回正确的资源

因为以上这些弊端,所以在 HTTP / 1.1 出现了 ETag


ETag


Etag是服务器在响应请求时,返回的当前资源文件一个唯一标识(由服务器生成),只要资源有变化,Etag就会重新生成

浏览器在向服务器发送请求时,会将上一次返回的Etag值放到请求头的If-None-Match字段里


服务端比较 If-None-Match 中的值跟目标资源的ETag是否一致


  • 一致,响应状态码为304
  • 不一致,响应状态码为200,并返回新的资源


网络异常,图片无法展示
|


特点:

  • ETag 优先级比 Last-Modified 高
  • ETag 是服务端通过算法计算得出,需要损耗一定时间


两者对比


  • Etag/If-None-Match优先级高于Last-Modified/If-Modified-Since
  • 即同时存在则只有Etag / If-None-Match生效
  • 性能上,Last-Modified要优于Etag
  • Last-Modified只需要记录时间
  • Etag需要服务器通过算法来计算出一个hash值
  • 在精确度上,Etag要优于Last-Modified
  • Last-Modified的时间单位是秒,如果某个文件在1秒内被改变了多次,那么它的Last-Modified没有体现出来修改
  • 文件只要发生改变,Etag就会改变


执行流程


  1. 强制缓存优先于协商缓存进行
  • 若强制缓存(Expires和Cache-Control)生效则直接使用缓存
  • 若不生效则进行协商缓存(Last-Modified / If-Modified-Since与Etag / If-None-Match)


  1. 协商缓存由服务器决定是否使用缓存
  • 若协商缓存失效,那么代表该请求的缓存失效,响应200,返回新的资源和缓存标识,并存入浏览器缓存中
  • 生效则响应304,表示继续使用现有缓存

网络异常,图片无法展示
|


如果什么缓存策略都没设置,那么浏览器会怎么处理:question:


对于这种情况,浏览器会采用一个启发式的算法

取响应头中的 Date 减去 Last-Modified 值的 10% 作为缓存时间


缓存策略应用场景


1. 频繁变动的资源


  1. 首先使用 Cache-Control: no-cache,使浏览器每次都请求服务器
  2. 配合 ETag 或 Last-Modified 来验证资源是否过期


这样的做法虽然不能节省请求数量,但是能显著减少响应数据大小


2. 代码文件


缓存除HTML外的文件

一般来说,现在都会使用工具来打包代码,那么就可以对HTML引用的静态资源的文件名进行哈希处理,只有当文件内容发生修改后才会生成新的文件名

因此可以给代码文件设置缓存有效期一年Cache-Control: max-age=31536000,这样只有当HTML文件中引入的文件名发生了改变才会去下载最新的代码文件,否则就一直使用缓存。


参考



原文首发于个人博客,专题系列会整理多篇,与大家一起学习,共同进步,如有错误,还请斧正


浏览器专题系列文章



相关文章
|
3月前
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
4月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
438 1
|
24天前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
19天前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
27 1
|
23天前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
36 4
|
1月前
|
缓存 监控 测试技术
如何利用浏览器的缓存来优化网站性能?
【10月更文挑战第23天】通过以上多种方法合理利用浏览器缓存,可以显著提高网站的性能,减少网络请求,加快资源加载速度,提升用户的访问体验。同时,要根据网站的具体情况和资源的特点,不断优化和调整缓存策略,以适应不断变化的业务需求和用户访问模式。
96 7
|
1月前
|
Web App开发 缓存 UED
如何设置浏览器的缓存策略?
【10月更文挑战第23天】通过合理地设置浏览器的缓存策略,可以在提高网页性能、减少网络流量的同时,确保用户能够获取到最新的内容,从而提升用户体验和网站的性能优化效果。
96 4
|
2月前
|
存储 缓存 JSON
vue2知识点:浏览器本地缓存
vue2知识点:浏览器本地缓存
50 2
|
2月前
|
存储 缓存 负载均衡
Nginx代理缓存机制
【10月更文挑战第2天】
103 4