从强缓存和协商缓存两个方面深入探究缓存机制

一、强缓存

强缓存主要是指利用http响应报文头中的Expires和Cache-Control字段来判断缓存是否失效,如果没有失效则使用本地缓存数据。

1. Expires字段

Expires: Wed, 21 Oct 2020 07:28:00 GMT

Expires是一个正好过期的日期时间,表示该时间前的响应都是有效的,即缓存在这个时间之前可以使用。但是该字段存在一些弊端,就是服务器返回的时间是在服务器端设置的,客户端与服务器端的时间可能不一致导致响应失效。

2. Cache-Control字段

Cache-Control: max-age=31536000

Cache-Control是HTTP/1.1协议新增的字段,它的值是max-age=xxxx,表示该响应在xxxx秒内是有效的,无论是否过期,都应该使用本地缓存。

同时,Cache-Control还可以设置其他属性,详情如下:

  • public:响应可以被所有的客户端缓存。
  • private:响应只能被单个用户缓存,不能被共享缓存、代理缓存等复用。
  • no-cache:客户端缓存服务器返回的响应,但在使用这些缓存数据之前,必须先向原服务器请求验证资源是否被修改过。
  • no-store:响应中禁止写入缓存,即不允许缓存此响应的任何版本。

二、协商缓存

协商缓存主要是利用http报文头中的Etag和Last-Modified字段结合缓存验证来决策是否使用缓存数据。如果服务器判断请求的资源未发生改变,则返回304 Not Modified状态码,告诉客户端可以使用本地缓存数据。

1. Etag字段

Etag: "2e22c4-d-560ac04e56b89"

Etag是一个类似于版本号的字段,由服务器返回,客户端根据这个值来判断缓存是否失效,可以认为是一个文件的唯一标识符。当客户端再次请求该文件时,通过If-None-Match字段带上上一次返回的Etag值告诉服务器本地缓存的版本号,服务器根据该值来判断缓存是否失效。

2. Last-Modified字段

Last-Modified: Mon, 19 Oct 2020 08:42:54 GMT

Last-Modified是一个时间戳,表示该文件最后一次修改的时间。当客户端再次请求该文件时,通过If-Modified-Since字段带上上一次返回的Last-Modified值告诉服务器本地缓存的最后修改时间,服务器根据该值来判断缓存是否失效。

3. 缓存验证

如果客户端请求的资源没有过期,则服务器会返回304 Not Modified状态码,告诉客户端可以使用本地缓存数据。此时响应报文中的实体主体不需要携带内容,通过设置头信息如下:

HTTP/1.1 304 Not Modified
Etag: "2e22c4-d-560ac04e56b89"
Cache-Control: max-age=31536000

三、应用场景

1. 强缓存

强缓存适用于静态资源不经常更新的场景,比如js、css、图片等静态文件。使用强缓存可以减少对服务器的请求,提高页面加载速度。

2. 协商缓存

协商缓存适用于动态数据或者静态文件的更新比较频繁的场景,协商缓存能够减少对服务器的请求次数,避免浪费带宽,提升用户体验。

四、代码示例

1. 强缓存

app.use(express.static(path.join(__dirname, 'public'), {
    maxAge: 60 * 60 * 24 * 365, // 单位为秒
    etag: false,
    lastModified: false
}));

设置maxAge参数为一年,表示客户端对于该资源的有效期为1年,当客户端再次访问该资源时会首先从本地缓存中查找,如果本地缓存失效则再向服务端发起请求。

2. 协商缓存

app.get('/api/data', function(req, res) {
    const data = {
        "name": "Tom",
        "age": 20,
        "address": "Beijing"
    };
    const time = new Date();
    res.set('Last-Modified', time.toUTCString());
    res.set('Expires', new Date(Date.now() + 60000).toUTCString());
    res.send(data);
});

设置Last-Modified和Expires响应头,告诉客户端本次响应的最后修改时间和过期时间,在客户端再次请求该资源时通过If-Modified-Since和If-None-Match两个字段进行验证,判断是否使用本地缓存。

五、总结

缓存机制是Web性能优化的重要方面,强缓存和协商缓存两种缓存方式在不同的业务场景下均能提升页面性能,减少请求次数,提高用户体验。在使用缓存机制时,需要根据具体的业务场景选择合适的缓存方式和合理的缓存时间,并进行定期的缓存清理,避免数据一直存储在本地缓存导致出现的一些问题。

原创文章,作者:DVAC,如若转载,请注明出处:https://www.506064.com/n/136194.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
DVAC的头像DVAC
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相关推荐

  • Python 数据缓存及其应用

    本文将为大家详细介绍Python数据缓存,并提供相关代码示例。 一、Python 数据缓存基础概念 Python 是一种解释型语言,每次执行完一条语句后就会将内存中的结果清空,如果…

    编程 2025-04-29
  • Python缓存图片的处理方式

    本文将从多个方面详细阐述Python缓存图片的处理方式,包括缓存原理、缓存框架、缓存策略、缓存更新和缓存清除等方面。 一、缓存原理 缓存是一种提高应用程序性能的技术,在网络应用中流…

    编程 2025-04-29
  • Spring S_CSRF防护机制实现及应用

    Spring S_CSRF防护机制是Spring Security框架提供的一个针对跨站请求伪造攻击(CSRF)的保护机制。本文将从以下几个方面详细介绍Spring S_CSRF防…

    编程 2025-04-28
  • Python的垃圾回收机制

    本文将对Python的垃圾回收机制进行详细阐述,着重介绍它的基本原理和实现方式。此外,我们还将介绍常见的问题及解决方法,并给出相应的代码示例。 一、Python的垃圾回收概述 垃圾…

    编程 2025-04-27
  • 机制与策略分离

    了解机制与策略分离的解决方法与优势 一、概述 机制与策略分离是一种软件设计理念,它将复杂的系统、组件等模块化,通过分离机制与策略,把模块实现的方式与具体使用方式分开。 机制是实现某…

    编程 2025-04-27
  • Java图片缓存的实现与优化

    Java中的图片缓存是Web开发中常用的技术,它可以提高网页的加载速度和用户体验。本文将从以下三个方面对Java图片缓存进行详细阐述: 一、图片缓存的基本实现 图片缓存技术是指将一…

    编程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25

发表回复

登录后才能评论