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

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

缓存策略


  • 强缓存
  • 协商缓存

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

都是通过设置 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文件中引入的文件名发生了改变才会去下载最新的代码文件,否则就一直使用缓存。


参考



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


浏览器专题系列文章



相关文章
|
7月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1298 0
|
9月前
|
存储 缓存 JSON
浏览器的缓存方式几种
浏览器缓存方式主要包括:1. **强制缓存**,通过 `Expires` 或 `Cache-Control` 控制,缓存有效期内不发起请求;2. **协商缓存**,使用 `ETag` 和 `Last-Modified` 判断资源是否更新;3. **Service Worker 缓存**,适用于 PWA 应用,拦截并返回缓存;4. **浏览器存储**,如 LocalStorage、SessionStorage 和 IndexedDB,用于持久化或会话级数据存储;5. **Push Cache**,仅限 HTTP/2,服务器主动推送资源。选择合适的缓存策略可优化性能和用户体验。
526 143
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
1010 1
|
9月前
|
存储 缓存 分布式计算
【赵渝强老师】Spark RDD的缓存机制
Spark RDD通过`persist`或`cache`方法可将计算结果缓存,但并非立即生效,而是在触发action时才缓存到内存中供重用。`cache`方法实际调用了`persist(StorageLevel.MEMORY_ONLY)`。RDD缓存可能因内存不足被删除,建议结合检查点机制保证容错。示例中,读取大文件并多次调用`count`,使用缓存后执行效率显著提升,最后一次计算仅耗时98ms。
221 0
【赵渝强老师】Spark RDD的缓存机制
|
缓存 监控 测试技术
如何利用浏览器的缓存来优化网站性能?
【10月更文挑战第23天】通过以上多种方法合理利用浏览器缓存,可以显著提高网站的性能,减少网络请求,加快资源加载速度,提升用户的访问体验。同时,要根据网站的具体情况和资源的特点,不断优化和调整缓存策略,以适应不断变化的业务需求和用户访问模式。
652 63
|
Web App开发 缓存 UED
如何设置浏览器的缓存策略?
【10月更文挑战第23天】通过合理地设置浏览器的缓存策略,可以在提高网页性能、减少网络流量的同时,确保用户能够获取到最新的内容,从而提升用户体验和网站的性能优化效果。
1011 60
|
缓存 应用服务中间件 Apache
缓存代理服务器的实现机制和技术选型
缓存代理服务器是一种特殊的代理服务器,其主要功能是缓存从目标服务器(通常是Web服务器)获取的数据,并在客户端再次请求相同数据时直接提供缓存的数据。通过缓存代理服务器可以加快访问速度并减轻目标服务器的负载。
562 99
|
12月前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####