HTTP 缓存新鲜度 max-age

news2024/11/24 14:28:30

新鲜度


理论上来讲,当一个资源被缓存存储后,该资源应该可以被永久存储在缓存中。由于缓存只有有限的空间用于存储资源副本,所以缓存会定期地将一些副本删除,这个过程叫做缓存驱逐。另一方面,当服务器上面的资源进行了更新,那么缓存中的对应资源也应该被更新,由于HTTP是C/S模式的协议,服务器更新一个资源时,不可能直接通知客户端更新缓存,所以双方必须为该资源约定一个过期时间,在该过期时间之前,该资源(缓存副本)就是新鲜的,当过了过期时间后,该资源(缓存副本)则变为陈旧的。

驱逐算法用于将陈旧的资源(缓存副本)替换为新鲜的,注意,一个陈旧的资源(缓存副本)是不会直接被清除或忽略的,当客户端发起一个请求时,缓存检索到已有一个对应的陈旧资源(缓存副本),则缓存会先将此请求附加一个If-None-Match头,然后发给目标服务器,以此来检查该资源副本是否是依然还是算新鲜的,若服务器返回了 304 (Not Modified)(该响应不会有带有实体信息),则表示此资源副本是新鲜的,这样一来,可以节省一些带宽。若服务器通过 If-None-Match 或 If-Modified-Since判断后发现已过期,那么会带有该资源的实体内容返回。

下面是上述缓存处理过程的一个图示:

Show how a proxy cache acts when a doc is not cache, in the cache and fresh, in the cache and stale.

对于含有特定头信息的请求,会去计算缓存寿命。比如Cache-control: max-age=N的头,相应的缓存的寿命就是N。

通常情况下,对于不含这个属性的请求则会去查看是否包含Expires属性,通过比较Expires的值和头里面Date属性的值来判断是否缓存还有效。如果max-age和expires属性都没有,找找头里的Last-Modified信息。如果有,缓存的寿命就等于头里面Date的值减去Last-Modified的值除以10(注:根据rfc2626其实也就是乘以10%)。

缓存失效时间计算公式如下:

expirationTime = responseTime + freshnessLifetime - currentAge

上式中,responseTime 表示浏览器接收到此响应的那个时间点。

Cache-Control


Cache-Control 可以由多个字段组合而成,主要有以下几个取值:

1. max-age 指定一个时间长度,在这个时间段内缓存是有效的,单位是s。例如设置 Cache-Control:max-age=31536000,也就是说缓存有效期为(31536000 / 24 / 60 * 60)天,第一次访问这个资源的时候,服务器端也返回了 Expires 字段,并且过期时间是一年后。

在没有禁用缓存并且没有超过有效时间的情况下,再次访问这个资源就命中了缓存,不会向服务器请求资源而是直接从浏览器缓存中取。

判断缓存是否过期


response_is_fresh = ( freshness_lifetime > current_age )
    • freshness_lifetime:按优先级,取以下响应头部的值
             • s-maxage > max-age > Expires > 预估过期时间
                  • 例如:
                               • Cache-Control: s-maxage=3600(1小时)
                               • Cache-Control: max-age=86400(1天)
                               • Expires: Fri, 03 May 2019 03:15:20 GMT
                                     • Expires = HTTP-date,指明缓存的绝对过期时间

 

 

 

为什么要预估缓存时间?


55%的请求没有携带max-age,也就是没有告诉客户端这个资源要不要缓存。

有些内容是不怎么相对变化的,比如图片,比如js css这些,但是服务器配置这些有问题,没有考虑到带宽的优化,体验性的提升,所以没有配置描述缓存过期时间的内容。

浏览器有默认缓存时间。

 

常见的预估时间


• RFC7234 推荐:(DownloadTime– LastModified)*10%

浏览器获取到响应的时间,lastmodify就是服务器端显示的就是上次资源修改的时间。这两个时间相减*10%。

浏览器端缓存无请求


expire 在浏览器端验证expire是否大于当前时间,若大于则不发送http请求,直接cache返回,F5强刷会绕过

Expires: Sun, 10 Feb 2002 16:00:00 GMT

max-age 与expire功能类似,记录的是一个时间长度(秒)。Expires在HTTP/1.0生效,Cache-Control:max-age在HTTP/1.1生效。max-age支持的情况下,优先级高于expire,expire值不生效。

Cache-control: max-age=5

Age 头部及 current_age 的计算


• Age 表示自源服务器发出响应(或者验证过期缓存,最初生成响应的时间),到使用缓存的响应发出时经过的秒数

       • 对于代理服务器管理的共享缓存,客户端可以根据 Age 头部判断缓存时间
       • Age = delta-seconds
current_age 计算: current_age = corrected_initial_age + resident_time
           • resident_time = now - response_time(接收到响应的时间)
             • corrected_initial_age = max( apparent_age , corrected_age_value )
                 • corrected_age_value = age_value + response_delay
                       • response_delay = response_time - request_time(发起请求的时间)
                 • apparent_age = max(0, response_time - date_value)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ControlNet控制Stable-Diffusion出图人物的姿势

概述 在Stable-Diffusion(以下简称SD)出图中,我们往往需要对出图人物的姿势进行控制,这里我使用一个比较简单上手的方法,通过ControlNet可以很方便地对画面风格,人物姿势进行控制,从而生成更加…

Python —— Windows10下训练Yolov5分割模型并测试

附:Python —— Windows10下配置Pytorch环境、进行训练模型并测试(完整流程,附有视频)   效果 手机拍摄一段工位视频,上传到win10训练了yolov5分割鼠标的样本后推理效果截图。 训练准备 1、查看自己下载的Yolov5源码是否存在"segment"文件夹,该文件夹下存在分…

【Python入门篇】——Python基础语法(字面量注释与变量)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…

有限等待忙等、让权等待死等、互斥遵循的几大原则——参考《天勤操作系统》,柳婼的博客

参考柳婼的博客 一、 有限等待&&死等 有限等待: 对请求访问的临界资源的进程,应该保证有限的时间进入临界区,以免陷入死等状态。受惠的是进程自己 死等: 进程在有限时间内根本不能进入临界区,而一直尝试进入陷入一种无结果的等待状…

在字节跳动做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧,某不知名 985 的本硕,17 年毕业加入字节,以“人员优化”的名义无情被裁员,之后跳槽到了有赞,一直从事软件测试的工作。之前没有实习经历,算是6年的工作经验吧。 这6年之间完成了一次…

TIM编码器接口

一、知识点 1、Encoder Interface 编码器接口的工作流程 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 2、编码器接口…

6.2.1邻接矩阵法

接下来我们将认识图的几种存储结构: 邻接矩阵,邻接表,十字链表,邻接多重表 图的存储 1)邻接矩阵法 0表示邻接vertex不邻接 只需要一个二位数组就可以实现: 顶点虽然是char类型,但可以存储更加…

搭建vue3+vite工程

搭建vue3vite工程 目录 搭建vue3vite工程 一、官方-文档-快速上手 二、详细截图及步骤 2.1、安装nvm 2.2、 用nvm安装多版本可切换的node.js版本 2.3、 按照官方文档初始化最近版本的vue3 三、脚本配置与调试 3.1、"2.3、"所产生的配置及脚本命令 3.2、脚本…

SpringCloud学习笔记06

九十五、Cloud Alibaba简介 0、why会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 1、是什么 官网:spring-cloud-alibaba/README-zh.md at 2.2.x alibaba/spring-cloud-alibaba GitHub 2、能干嘛 3、去哪下 spring-cloud-alibaba/README-…

Linux——理解文件系统和动静态库

一、理解文件系统 使用命令查看信息 1,使用ls -l查看文件属性和文件内容 2,stat文件名查看更多信息 3,inode Linux中的文件分为文件属性和文件内容。文件属性又称为元信息。保存在inode结构中,inode是一个文件属性的集合。一个文…

Oracle SQL执行计划操作(13)——其他相关操作

该类操作主要包括以上未进行讲解的其他相关操作。根据不同的具体SQL语句及其他相关因素,如下各操作可能会出现于相关SQL语句的执行计划。 1)SELECT STATEMENT 检索表中数据。该操作出现于通过select语句检索表中数据时产生的执行计划。该操作具体如图15-1中节点0所示。 图1…

除了Axure,还有哪些原型设计工具

产品原型设计工具是设计师制作产品原型必不可少的工具。产品原型工具可以帮助我们解决很多问题,但产品原型工具的选择已经成为一个大问题。 除了我们熟悉的产品原型设计工具Axure,市场上还有很多有用的产品原型设计工具,本文将分享7种有用的…

redis详解之数据结构

目录 Redis是什么 Redis字符串的特点: 1字符串的存储 2字符串的获取 3字符串的删除 4字符串的计数 5字符串的修改 6字符串的批量操作 7字符串的二进制安全性 总结: Redis是什么: Redis是一种基于内存的键值对存储数据库,…

C++命名空间的定义以及使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、命名空间定义?1.1定义:1.2变量在域中的访问顺序: 二、命名空间使用2.1加命名空间名称及作用域限定符(推荐&a…

【致敬未来的攻城狮计划】— 连续打卡第二十一天:RA2E1_UART —— 串口控制LED亮灭

系列文章目录 1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

js高级记录

目录 1.怎么理解闭包? 2.闭包的作用? 3.闭包可能引起的问题? 4.变量提升 5.函数动态参数 6.剩余参数 ...(实际开发中提倡使用) 7.展开运算符 8.箭头函数 9.解构赋值(数组、对象) 1.怎么理…

为UOS启用VNC和Windows远程桌面

1 参考资料 UOS系统中安装x11vnc远程桌面 如何通过windows电脑远程UOS桌面RDP 已在ARM版本和X86版本中验证均可用 2 准备工作 2.1 设置代理(可选) 如果设备本身能和公网通,就不需要了。 由于我们全程需要在root账号下进行,系…

RadSystems Studio crack视觉设计和快速行动

RadSystems Studio crack视觉设计和快速行动 RadSystems Studio是一个充满激情的开发和保存环境,不需要专门的编程。该软件提供数字解决方案和组件,以尽快在API和UI中构建程序,只需少量代码,甚至无需编写。该软件减少了编写时间并…

Kubeadm方式搭建K8s集群【1.27.0版本】

文章目录 一、集群规划及架构二、系统初始化准备(所有节点同步操作)三、安装并配置cri-dockerd插件四、安装kubeadm(所有节点同步操作)五、初始化集群六、Node节点添加到集群七、安装网络组件Calico八、测试CoreDNS解析可用性九、拓展1、ctr和crictl命令具体区别2、calico多网卡…

【计算机视觉 | 图像分割】通用AI大模型Segment Anything在医学影像分割的性能究竟如何?

最近看到了一篇论文: 论文地址为: https://arxiv.org/pdf/2304.14660.pdf这篇文章用来探究最近大火的大模型SA在医学图像上的效果。 文章目录 一、前言二、数据集展示三、方法展示四、结果分析 一、前言 近半年来,ChatGPT、DALLE等引发了大…