HTTP 缓存

一、概述

1.HTTP缓存的基本原理是将Web资源(如HTML,CSS,JavaScript,图片等)保存在客户端或中间代理服务器上,后续的请求可以直接使用客户端或代理服务器上缓存的资源,而不必重新从服务器上获取。

2.HTTP缓存分为强制缓存和协商缓存。

二、强制缓存

1.不需要服务端参与判断是否继续使用缓存,当客户端第一次请求数据时,服务端返回了缓存的过期时间(Expires 与 Cache-Control),没有过期就可以继续使用缓存,否则就需要继续从服务端获取。

2.Expires字段因时区差异、格式限制等原因已逐渐被Cache-Control字段取代。

三、协商缓存

1.需要服务端参与判断是否继续使用缓存,当客户端第一次请求数据时,服务端会将缓存标识(Last-Modified/If-Modified-Since 与ETag/If-None-Match)与数据一起返回给客户端,客户端将两者都备份到缓存中 ,再次请求数据时,客户端将上次备份的缓存标识发送给服务端,服务端根据缓存标识进行判断,如果返回HTTP状态码 304(Not Modified ,请求的资源自上次请求以来没有被修改),则表示客户端可以继续使用缓存。若资源已修改,则返回200状态码和新的资源内容。

2.协商缓存的实现主要通过HTTP请求头中的If-Modified-Since和If-None-Match字段,以及响应头中的Last-Modified(资源的最后修改时间)和ETag(资源的版本标识符)字段来完成。

3.资源更新后,可通过修改资源的URL或更新ETag和Last-Modified头来使缓存失效。

四、HTTP 状态码304的工作流程(资源自上次请求以来没有被修改)

1.初次请求

客户端第一次请求资源时,服务器会返回该资源及其缓存相关信息(如 Last-Modified 头部或 ETag)。

​2. 缓存请求

在后续请求中,客户端会带上之前缓存的相关信息(例如 If-Modified-Since 或 If-None-Match 头),以检查资源是否已被修改。

​3. 服务器响应

服务器检查资源的状态。如果自上次请求以来资源没有被修改,服务器会返回 304 Not Modified 状态码,告诉客户端可以继续使用缓存的资源。

客户端收到 304 响应后,使用缓存中的资源,而不需要从服务器下载。

五、HTTP缓存的优点

1.避免重复资源的下载,减少不必要的网络传输。

2.从缓存中获取内容可以提升页面加载速度。

3.减轻服务器压力。

六、总结

1.强制缓存优先于协商缓存。

2.强制缓存使用的的两个标识:

1)Expires

Expires 的值为服务端资源过期的时间(一个GMT格式的日期时间字符串),即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。到期时间是服务端生成的,客户端和服务端的时间可能有差别。

2)Cache-Control

Expires 有个时间校验的问题,所以 HTTP1.1 采用 Cache-Control替代 Expires。

Cache-Control 的取值有以下几种:

private: 客户端可以缓存。响应只能被单个用户缓存,不能被共享缓存存储。

public: 客户端和代理服务器都可缓存。

max-age=xxx: 资源被认为新鲜的最大时间。缓存的内容将在 xxx 秒后失效 。

no-cache: 需要使用协商缓存来验证缓存数据。 缓存内容但立即过期,每次请求都需要与服务器验证缓存的有效性。

no-store: 所有内容都不会缓存,强制缓存和协商缓存都不会被触发。

不允许缓存。

3.HTTP缓存应用在静态资源缓存、动态内容缓存、API接口缓存等场景中。

4.对于频繁更新的资源,应设置较短的缓存时间或采用协商缓存模式。

对于不常更新的资源,应设置较长的缓存时间或采用强制缓存模式。

5.在缓存资源发生变更时,应及时更新缓存信息,以确保客户端获取到最新的资源内容。

6.当资源过期时,客户端会向服务器发送一个验证请求,以检查资源是否发生了变化。

若资源已更改,则服务器返回新的资源,否则客户端继续使用缓存中的副本。

7.使用强制缓存时不会发送请求到服务器,使用协商缓存时会发送请求到服务器以验证资源是否更新。

8.在文件名中包含版本号或哈希值,可防止客户端使用旧版本的缓存文件。

9.敏感数据不应被缓存,或者使用HTTP头no-store来防止缓存。

10.缓存粒度

1)逐资源缓存:每个资源独立缓存。

2)分组缓存:将相关的资源组合在一起进行缓存,如CSS Sprites或JavaScript模块。

11.使用浏览器里的开发者工具可以监控和调试HTTP缓存的行为。


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

相关推荐
清水白石008几秒前
从手写初始化到 pytest fixture:让 Python 测试既干净、可复用,又能驾驭异步并发
开发语言·python·pytest
艾莉丝努力练剑2 分钟前
【Linux网络】Linux 网络编程:应用层自定义协议与序列化(1)初识
linux·运维·服务器·网络·c++·udp·tcp
不知名的老吴5 分钟前
关于C++中new的基本使用方法介绍
开发语言·c++
在角落发呆6 分钟前
c socket 服务器转发,c socket 服务器转发的方法
服务器·c语言·开发语言
yujunl8 分钟前
U9一种客开方案的解决
开发语言
wjs20248 分钟前
Python pass 语句详解
开发语言
专注VB编程开发20年9 分钟前
专业分析python底层调用与按键精灵,ah3等的对比,hookdll,内存加载,调用.net dll
开发语言·javascript·python·microsoft·php·.net
时间不早了sss9 分钟前
Python处理文档
开发语言·前端·python
cici1587411 分钟前
MATLAB GUI构建一个AIS自动船舶系统
开发语言·matlab
一氧化二氢.h12 分钟前
【java】的数组列表和集合的区别是什么
java·开发语言