首页 > 其他分享 >【系统设计】深入理解HTTP缓存机制:从Read-Through缓存到HTTP缓存的交互流程

【系统设计】深入理解HTTP缓存机制:从Read-Through缓存到HTTP缓存的交互流程

时间:2024-10-29 17:49:02浏览次数:3  
标签:缓存 HTTP CDN Modified Through 磁盘 资源

在现代Web开发中,缓存机制扮演着至关重要的角色。它不仅提升了用户体验,还极大地优化了资源的使用效率。在这篇博文中,我们将从“Read-Through”缓存的概念出发,深入探讨HTTP缓存的工作原理和交互流程,并详细描述max-ageLast-Modified、以及ETag在缓存管理中的重要性。

什么是Read-Through缓存?

“Read-Through”缓存是一种常见的缓存策略,通常用于后端服务器和数据库之间。其核心思想是,当客户端请求数据时,应用程序首先从缓存中读取。如果缓存命中,则直接返回数据;如果缓存未命中,则从原始数据源(如数据库)获取数据,并将其存储到缓存中,供后续请求使用。

这种模式的优势在于,它将数据的获取逻辑和缓存管理封装在一个统一的接口下,使得缓存对应用程序是透明的。应用程序无须关心数据的来源,只需请求数据即可。

HTTP缓存机制:应用Read-Through的思维

类似于Read-Through缓存,HTTP缓存机制也旨在优化数据获取和提升性能。HTTP缓存主要发生在客户端(如浏览器)与服务器之间,其交互过程包括首次请求、缓存命中以及缓存失效。

1. 首次请求(Cache Miss)

当用户首次访问某个资源时,浏览器直接向服务器请求该资源。服务器响应请求,并在响应头中包含缓存指令,如Cache-ControlExpires,以及用于缓存验证的头,如ETagLast-Modified。浏览器根据这些头信息将资源缓存起来。

2. 缓存命中(Cache Hit)

在缓存的有效期内,用户再次请求相同资源时,浏览器会直接从本地缓存中获取资源,而无需向服务器发送请求。这大幅减少了网络传输时间和带宽消耗。

3. 缓存失效(Cache Expired/Validation Needed)

当缓存过期或用户强制刷新页面时,浏览器需要验证缓存的有效性。这时,浏览器会发送条件请求,附带If-None-MatchIf-Modified-Since头,询问服务器资源是否更新。

  • 如果资源未更新,服务器返回304 Not Modified状态码,客户端可以继续使用缓存的数据。
  • 如果资源已更新,服务器返回200 OK和新的资源内容,客户端更新缓存。
客户端如何认定缓存失效?
  • Cache-Control: max-age

    • 定义max-age 指定资源在缓存中的有效时长(以秒为单位),从客户端收到响应时开始计时。
    • 失效判断:当经过的时间超过 max-age 指定的秒数,缓存被认为是失效的,客户端需要验证或重新获取资源。
  • Last-ModifiedIf-Modified-Since

    • Last-Modified:服务器在响应中提供的头信息,表示资源最后一次被修改的时间。
    • If-Modified-Since:客户端在验证请求中使用的头信息,询问服务器自指定时间后资源是否被修改。
    • 工作机制:客户端利用 Last-Modified 的时间戳,通过发送 If-Modified-Since 来判断资源是否更新。服务器基于此头信息返回 304 Not Modified200 OK
  • ETagIf-None-Match

    • ETag:是服务器生成的资源的唯一标识符,类似于指纹,用于精确检查资源的变化。
    • If-None-Match:客户端在验证请求中使用此头信息,将上次接收到的 ETag 发送给服务器,询问服务器资源是否发生变化。
    • 工作机制:服务器根据 If-None-Match 提供的 ETag 判断资源是否自上次请求后发生改变。如果没有变化,返回 304 Not Modified,否则返回 200 OK 和更新后的资源内容。
图示化缓存交互过程
+------------------+       +------------------+
|     浏览器       |       |     服务器       |
+------------------+       +------------------+
        |                             |
        |   请求资源 (GET /example)   |
        |---------------------------->|
        |                             |
        |  响应资源并设置缓存头        |
        |<----------------------------|
        |  HTTP/1.1 200 OK            |
        |  Cache-Control: max-age=3600|
        |  ETag: "abc123"             |
        |  Last-Modified: ...         |
        |                             |
        |  缓存资源                    |
        +-----------------------------+
        |                             |
        |   检查缓存是否失效          |
        |   如果失效,发起条件请求    |
        |   GET /example              |
        |   If-None-Match: "abc123"   |
        |   If-Modified-Since: ...    |
        |---------------------------->|
        |                             |
        |   服务器验证资源状态        |
        |<----------------------------|
        |   304 或 200 响应           |
        |                             |
        |   根据响应决定使用缓存或更新缓存 |
        +-----------------------------+
CDN 与 HTTP 缓存机制概述

CDN(内容分发网络)在提升网站性能和用户体验方面起着至关重要的作用,主要通过其缓存机制来减少源站负载并加速内容传输。CDN 利用 HTTP 缓存机制磁盘/内存缓存 的结合,将内容分发到全球各地的边缘节点,确保用户能够快速获取所需资源。

1. CDN 与 HTTP 缓存机制

CDN 通过充当 HTTP 客户端从源站获取内容,并根据 HTTP 头部(如 Cache-ControlExpiresETagLast-Modified 等)来控制缓存行为。当用户请求资源时,CDN 会首先在其缓存中查找资源:

  • Cache-Control 指定缓存的有效时长或缓存策略(如 max-ageno-cache 等)。
  • Expires 指定资源的失效时间。
  • ETag 和 Last-Modified 允许 CDN 通过条件请求验证缓存内容是否仍然有效。

如果缓存未命中或内容过期,CDN 会向源站发起请求,并将新的资源缓存到其边缘节点。通过这种机制,CDN 能够减少源站请求次数,加速用户访问。

2. CDN 缓存数据的存储:内存与磁盘

CDN 缓存数据的存储分为 内存缓存磁盘缓存。这两种存储方式各有优缺点,根据内容的访问频率、大小和缓存策略,CDN 会选择不同的存储方式:

  • 内存缓存:用于存储高频率访问的小文件(如图片、CSS、JS)。内存缓存速度极快,但容量有限,通常只存储热门资源。

  • 磁盘缓存:用于存储较大或访问频率较低的文件(如视频、PDF、音频等)。磁盘缓存的容量较大,适合长时间保存内容,特别是大文件,可以有效减轻源站的压力。

CDN 边缘节点首先检查内存缓存,未命中时再检查磁盘缓存。如果两者都未命中,则向源站拉取内容并更新缓存。

3. 磁盘缓存的文件组织和管理

CDN 通常通过哈希算法将 URL 转换为缓存键,并将内容存储在磁盘上的文件系统中,或使用缓存引擎(如 Nginx 或 Varnish)来管理缓存文件。文件通常会根据哈希值生成路径,以提高查找效率。缓存文件包含资源的实际内容和元数据(如过期时间)。

4. 缓存淘汰策略

由于缓存空间有限,CDN 采用多种策略管理缓存:

  • LRU(最近最少使用):优先移除最久未使用的内容。
  • TTL(生存时间):根据 HTTP 头中的设置,缓存内容在指定时间后自动失效。
  • 最大存储限制:当缓存空间达到上限时,CDN 会自动清理旧的缓存文件。
5. 实际应用场景

CDN 在各种场景中广泛使用磁盘缓存和内存缓存来存储内容:

  • 静态资源:如图片、CSS、JavaScript 等,通常会缓存到内存或磁盘中,以加快加载速度。
  • 视频流:大文件如视频流媒体,通常会存储在磁盘缓存中,减少带宽占用并优化传输性能。
  • API 响应:某些 API 响应(如天气数据)可以短时间缓存,减少频繁请求源站的负担。
6. 缓存持久化与恢复

磁盘缓存的持久化特性使其在边缘节点重启后仍能保留已缓存的内容,避免缓存命中率的下降。相比之下,内存缓存中的内容会在重启后丢失。因此,磁盘缓存在保持缓存持久性方面具有重要作用。
CDN 利用 HTTP 缓存机制和分层存储策略(内存与磁盘缓存)来最大化缓存效率。通过合理使用 Cache-Control 等 HTTP 头部,CDN 能够有效减少源站请求、提升用户访问速度,并通过内存和磁盘的结合在性能和存储容量之间取得平衡。磁盘缓存的持久化特性进一步确保了系统的稳定性和缓存的长期有效性。

总结

通过从Read-Through缓存的角度理解HTTP缓存,我们能够更清晰地认识到缓存机制在Web应用中的重要性。max-ageLast-Modified、以及ETag头信息在客户端缓存管理中扮演着关键角色,它们共同帮助客户端判断缓存是否失效,确保用户始终获取最新且最有效的资源。掌握这些缓存交互流程和头信息设置,对于优化Web应用性能至关重要。无论是开发者还是系统架构师,深入理解这些机制都有助于设计更高效、更可靠的Web服务。

标签:缓存,HTTP,CDN,Modified,Through,磁盘,资源
From: https://blog.csdn.net/yhkal/article/details/143325046

相关文章

  • Python——发送HTTP请求
    在当今这个高度数字化的时代,网络请求成为了我们日常生活中不可或缺的一部分。无论是浏览网页、在线购物还是社交媒体互动,背后都涉及到了无数次的网络请求。Python,作为一种广泛使用的编程语言,提供了强大的库来处理这些网络请求。aiohttp是一个流行的异步HTTP客户端/服务端框架......
  • 禁用tomcat缓存过滤器
    <!--去掉tomcat的etag和Last-Modified响应头的过滤器--> <filter> <filter-name>noetag</filter-name> <filter-class>com.epoint.basic.filter.EpointNoETagFilter</filter-class> </filter> <filter-mapping> <f......
  • 如何封装一个可取消的 HTTP 请求?
    前言你可能会好奇什么样的场景会需要取消HTTP请求呢?确实在实际的项目开发中,可能会很少有这样的需求,但是不代表没有,比如:假如要实现上述这个公告栏,每点击一个tab按钮就会切换展示容器容器中的内容,但是由于这是三个tab按钮对应展示容器和信息条目结构样式都一致,于是......
  • 【单片机】用mipi_dsi点亮屏幕,帧缓存写入失败原因
    mipi_dsi协议    mipi协议的优点在于传输快,可以通过双边传输的,然后可以多组通讯线进行数据传输,也就是所谓的lane,正常都是1组或者2组。其快速通讯和处理的功能主要用于显示界面UI的设计,也就是所谓的LVGL。      但是其缺点也很明显,就在于没有内部内存......
  • httpsok:自动续期SSL证书的最佳选择!
    一、引言        在数字化时代,网站的安全性至关重要,而SSL证书是保护用户数据、提升网站信誉的关键。然而,证书的续期往往令人头痛。今天,我们为你介绍一款高效的SSL证书自动续期工具——httpsok,让你的证书管理变得轻松无忧。二、什么是httpsok?httpsok是一款专为网站......
  • nginx 根路径同时代理 http ws sse 三种请求
    HTTP(HyperTextTransferProtocol):超文本传输协议,是用于在客户端(通常是web浏览器)和服务器之间传输数据的协议。HTTP是Web的基础,用于请求和传输网页、图像、视频等资源。它采用请求-响应模型,支持多种方法(如GET、POST等),并可通过HTTP/1.1和HTTP/2等版本进行优化,以提高性能和用户体验。......
  • [已解决·实验日志] AutoDL系统盘异常爆满,原因是debug 途中退出(ctrl+c),导致缓存文件
    今天照常debug中途退出,准备服务器GPU关机,突然看到系统盘爆满,顿时血压升高,咱来一探究竟参考文档:AutoDL帮助文档 (系统盘空间不足)Linux常用命令-CSDN博客cd/去到根目录看看,究竟是哪个文件夹占空间,使用du-sh命令来递归显示文件夹所占空间du-sh发现是tmp异常大,进......
  • go高并发之路——本地缓存
    一、使用场景试想一个场景,有一个配置服务系统,里面存储着各种各样的配置,比如直播间的直播信息、点赞、签到、红包、带货等等。这些配置信息有两个特点:1、并发量可能会特别特别大,试想一下,一个几十万人的直播间,可能在直播开始前几秒钟,用户就瞬间涌入进来了,那么这时候我们的系统就得......
  • HTTP相关返回值异常如何解决(上篇)
    ​今天我们讲讲HTTP相关返回值异常如何解决(实例持续更新中)一、HTTP介绍HTTP(超文本传输协议,HypertextTransferProtocol)是用于在网络上进行数据交换的应用层协议。它是万维网(WWW)的基础,允许客户端(通常是网页浏览器)与服务器之间进行通信。以下是对HTTP的一些基本介绍:基本概......
  • Watt Toolkit 报错:加速服务启动失败,443端口被 svnhttpsvc (4996) 占用
    问题描述WattToolkit(原名Steam++)启动加速时报错,显示443端口被svnhttpsvc(4996)占用了。svnhttpsvc是VisualSVNServer的一个应用程序,使用HTTPS协议,默认端口为443。在任务管理器(桌面底部任务栏右键打开)中搜索进程svnhttpsvc的PID4996可以看到svnhttpsvc是正......