首页 > 其他分享 >说说你对304缓存的理解

说说你对304缓存的理解

时间:2024-12-02 10:04:04浏览次数:6  
标签:缓存 Last 304 Modified 理解 浏览器 资源

304 Not Modified 缓存机制是HTTP协议中非常重要的一环,它允许浏览器在特定条件下复用本地缓存,从而减少网络请求,加快页面加载速度,并节省带宽。 它主要依赖于If-Modified-SinceIf-None-Match这两个HTTP请求头,以及Last-ModifiedETag这两个HTTP响应头协同工作。

以下是304缓存机制的详细解释:

1. 浏览器第一次请求资源:

  • 浏览器向服务器发送请求,获取资源。
  • 服务器返回资源,并在响应头中包含 Last-ModifiedETag
    • Last-Modified:资源在服务器上的最后修改时间。
    • ETag:资源的实体标签,可以理解为资源的唯一标识符,通常是根据资源内容生成的哈希值。

2. 浏览器再次请求相同资源:

  • 浏览器检查本地缓存中是否有该资源的副本。
  • 如果有,浏览器会将缓存中的 Last-Modified 值添加到请求头 If-Modified-Since 中,并将缓存中的 ETag 值添加到请求头 If-None-Match 中,然后发送请求给服务器。

3. 服务器处理请求:

  • 服务器接收到请求后,会将请求头中的 If-Modified-SinceIf-None-Match 与资源当前的 Last-ModifiedETag 进行比较。
  • 如果资源没有被修改过 (即 If-Modified-Since 等于或晚于 Last-Modified,并且 If-None-MatchETag 相同),服务器返回 304 Not Modified 状态码,不包含资源内容。
  • 如果资源已被修改过,服务器返回 200 OK 状态码,并返回最新的资源内容以及新的 Last-ModifiedETag

4. 浏览器处理响应:

  • 如果收到 304 Not Modified,浏览器就知道可以使用本地缓存的资源,从而避免了下载资源,节省了时间和带宽。
  • 如果收到 200 OK,浏览器会更新本地缓存,并将新的资源渲染到页面上。

关键点总结:

  • Last-ModifiedIf-Modified-Since 基于时间进行比较,精度为秒级,如果资源修改时间小于一秒,可能导致缓存失效。
  • ETagIf-None-Match 基于资源内容的哈希值进行比较,更加精确,可以避免 Last-Modified 的精度问题。
  • 服务器可以只使用 Last-ModifiedETag,也可以两者都使用。最佳实践是两者都使用,以提供更可靠的缓存机制。
  • 304 缓存机制是协商缓存的一种,它需要浏览器和服务器之间进行通信来确定是否使用缓存。
  • 对于一些不会频繁更改的静态资源,例如图片、CSS、JavaScript 文件等,使用 304 缓存机制可以显著提高网站性能。

前端开发中的注意事项:

  • 正确设置 Cache-ControlExpires 等响应头,以控制缓存的有效期。
  • 对于需要实时更新的资源,可以添加版本号或时间戳等参数到 URL 中,以强制浏览器重新请求资源,避免使用缓存。
  • 使用构建工具 (例如Webpack) 可以自动为静态资源添加哈希值,方便实现缓存控制。

通过理解和正确使用 304 缓存机制,可以有效提升网站的性能和用户体验。

标签:缓存,Last,304,Modified,理解,浏览器,资源
From: https://www.cnblogs.com/ai888/p/18581059

相关文章

  • 说下你对css样式的这几个属性值initial、inherit、unset、revert的理解
    这四个CSS属性值initial、inherit、unset和revert都与元素样式的继承和重置有关,但它们的作用方式略有不同:initial(初始值):将属性设置为浏览器样式表中定义的默认值。每个属性都有其初始值,例如,background-color的初始值为transparent,font-size的初始值为medium,d......
  • 说说你对前端架构师职位的理解,你觉得前端架构师应具备什么样的技能呢?
    前端架构师,我的理解是,他扮演着前端团队的技术领航员和守护者角色,负责搭建和维护前端项目的整体架构,确保项目的可扩展性、可维护性、性能和安全性。他不仅仅是一个资深的前端开发者,更是一个技术决策者和团队的指导者。他需要具备宏观的技术视野,能够预见项目发展的技术挑战,并提前......
  • 你所理解的css高级技巧有哪些?
    CSS高级技巧涵盖了许多方面,目的在于提升代码质量、页面性能和开发效率。以下是一些我理解的CSS高级技巧,并根据类别进行划分:布局与定位:Grid布局:比Flexbox更强大,适合复杂的二维布局,能够轻松实现各种网格布局,包括不规则的和重叠的。Flexbox布局:用于一维布局,快速灵......
  • 举例说明你对前端工程化的理解
    前端工程化是指一系列方法和工具的集合,用于提升前端开发效率、代码质量、可维护性以及项目整体的可管理性。它涵盖了从项目初始化、开发流程、代码构建、测试、部署到后期维护的整个生命周期。以下是一些前端工程化的例子,涵盖不同方面:1.模块化开发:问题:早期前端代码常常是......
  • 说说你对postMessage的理解,它有什么运用场景呢?
    postMessage是一个强大的方法,允许在不同浏览器窗口(包括标签页、iframe、弹出窗口)或同一窗口的不同JavaScript执行上下文(例如,主线程和WebWorker)之间安全地进行跨域通信。它绕过了同源策略的限制,实现了灵活的数据交换。核心理解:postMessage的工作机制类似于发送消息。源窗......
  • 举例说明你对前端自动化的理解
    前端自动化涵盖许多方面,目的是提高前端开发效率,减少重复性工作,并提升代码质量。以下是一些例子:1.任务运行器(TaskRunners):场景:项目需要编译Sass/Less,压缩JavaScript和图片,并实时刷新浏览器。工具:Gulp,Grunt,npmscripts自动化操作:配置任务运行器,例如Gulp,执......
  • 说说你对相对路径和绝对路径的理解
    在前端开发中,相对路径和绝对路径用于指示文件(例如HTML文件、CSS文件、JavaScript文件、图像等)的位置。它们的区别在于参照点不同:1.相对路径(RelativePath):参照点:当前文件所在的目录。描述:相对路径从当前文件所在位置出发,描述目标文件的位置。示例:./sty......
  • redis学习4~基于逻辑过期方式解决缓存击穿问题
    1.2.增加过期时间,不对原先实体类进行修改方法data即是原实体类。2.热点数据提前导入到缓存:店铺数据加入到缓存中,提前做预热(实际开发中可能有后台可以添加)3.单元测试:向redis中加入店铺数据,完成数据预热4.实现逻辑过期解决缓存击穿创建线程池(10个线程)缓存重建:......
  • 唤醒数据,我理解的数据驱动秘籍
    五、设计思路5.1基于OpenHarmony的帕金森数据采集模块  帕金森数据采集模块可以实现对帕金森手部的相关数据进行采集,包括手部禁止性震颤、手指弯曲情况、手部肌电信号、手指捏合压力等数据,实现无线远程采集。在患者日常生活中,可以使用采集设备进行日常采集和评估。内部由加速......
  • 对串口接收时发送数据会导致被接收的数据错位乃至丢失的原理解读
    缘由:在进行STM32与ESP8266通信时,我在接收中断中使用了HAL_UART_Transmit与printf函数,发现ESP8266返回来的数据有一定的丢失与错位现象,在对逻辑进行改写后发现问题与HAL库本身函数有关,这引起了我对其的兴趣。原理:我使用了串口空闲中断接收数据,而HAL_UART_Transmit在底层调用......