我的编程空间,编程开发者的网络收藏夹
学习永远不晚

HTTP缓存机制的原理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

HTTP缓存机制的原理

这篇文章主要介绍“HTTP缓存机制的原理”,在日常操作中,相信很多人在HTTP缓存机制的原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HTTP缓存机制的原理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!


Web缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN缓存)、浏览器缓存。

浏览器缓存也包含很多内容:HTTP缓存、indexDBcookielocalstorage等等。 这里要说的是http缓存。

使用缓存的好处

  • 减少了冗余的数据传输

  • 缓解了网络瓶颈的问题

  • 降低了对原始服务器的要求

  • 降低了距离时延

术语

缓存命中率:从缓存中得到数据的请求数与所有请求数的比率。理想状态是越高越好。

过期内容:超过设置的有效时间,被标记为“陈旧”的内容。通常过期内容不能用于回复客户端的请求,必须重新向源服务器请求新的内容或者验证缓存的内容是否仍然准备。

验证:验证缓存中的过期内容是否仍然有效,验证通过的话刷新过期时间。

失效:失效就是把内容从缓存中移除。当内容发生改变时就必须移除失效的内容。

机制

HTTP缓存机制的原理

策略

1)缓存存储策略

缓存存储策略决定了客户端是否应该存储httpresponse。与缓存存储有关的http header主要为response header中的Cache-Control。该header有下面几个对应的值:PublicPrivateno-cachemax-ageno-store。除了no-store,其它几种都会表明response应该被客户端缓存。

指令说明
Public所有内容都将被缓存(客户端和代理服务器都可缓存)
Private内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)
max-age = xxx (xxx is numeric)缓存的内容将在 xxx 秒后失效,失效前可以直接使用本地缓存,失效后必须向服务器确认资源是否已经改变。
no-store完全不在客户端缓存
no-cache可以认为等同于 max-age=0 的情况,即将 response 缓存在客户端,但是之后每次都向服务器确认资源是否已经改变

通过Cache-Control:Public设置我们可以将HTTP响应数据存储到本地,但此时并不意味着后续浏览器会直接从缓存中读取数据并使用, 因为它无法确定本地缓存的数据是否可用(可能已经失效),需通过缓存过期策略来判断

2)缓存过期策略

缓存过期策略决定了客户端存储在本地的缓存数据是否已过期,如未过期则可以直接使用本地存储的数据,否则就需要发请求到服务端尝试重新获取数据。 与缓存过期策略有关的http header 为Expires

Expires表示缓存数据有效的绝对时间,告诉客户端到了这个时间点后本地缓存就失效了,在这个时间内客户端可以不请求服务器而直接从本地缓存中使用已存储的结果。

需要注意的是:no-cache和max-age=xxx的优先级高于Expires,当它们同时存在的时候,后者会被覆盖掉。其次, 缓存数据过期只是告诉客户端不能再直接从本地读取缓存了,而是需要再发一次请求到服务器去确认。具体什么情况下本地存储的数据还可以继续使用就与缓存对比策略有关了。

3)缓存对比策略

将缓存在客户端的数据标识发往服务端,服务端通过标识来判断客户端缓存数据是否仍有效,进而决定是否要重发数据。客户端检测到数据过期或浏览器刷新后,会重新发起一个 http 请求到服务器,服务器此时并不急于返回数据,而是看请求头有没有带标识(If-Modified-Since、If-None-Match)过来,如果判断标识仍然有效,则返回304告诉客户端取本地缓存数据来用即可(这里要注意的是你必须要在首次响应时输出相应的头信息(Last-Modified、ETags)到客户端)。 本地缓存数据即使被认为过期,并不等于数据从此就没用了。

缓存过期取值

存储策略里面no-cache等同于max-age=0,假如服务端返回的响应中没有指明max-ageno-cacheExpires时,客户端是否会缓存 http response呢 ?通过FiddlerCharles等抓包工具可以发现,客户端一样会进行缓存

其取值值为响应头中的DateLast-Modified之间的差值的10%作为缓存有效时间

FiddlerCaching面板中可以看到

HTTP/1.1 Cache-Control Header is present: private
HTTP Last-Modified Header is present: Tue, 08 Nov 2016 06:59:00 GMT
No explicit HTTP Cache Lifetime information was provided.
Heuristic expiration policies suggest defaulting to: 10% of the delta between Last-Modified and Date.
That's '05:15:02' so this response will heuristically expire 2016/11/11 0:46:01.

用一副图来表示

HTTP缓存机制的原理

缓存的控制

1)强制缓存

可以通过ExpiresCache-Control来设定,Expires指缓存过期的时间,超过了这个时间点就代表资源过期。有一个问题是由于使用具体时间,如果时间表示出错或者没有转换到正确的时区都可能造成缓存生命周期出错。 并且ExpiresHTTP/1.0的标准,现在更倾向于用HTTP/1.1中定义的Cache-Control。两个同时存在时也是Cache-Control的优先级更高。

2)协商缓存

缓存的资源到期了,并不意味着资源内容发生了改变,如果和服务器上的资源没有差异,实际上没有必要再次请求。客户端和服务器端通过某种验证机制验证当前请求资源是否可以使用缓存。 浏览器第一次请求数据之后会将数据和响应头部的缓存标识存储起来。再次请求时会带上存储的头部字段,服务器端验证是否可用。如果返回304 Not Modified,代表资源没有发生改变可以使用缓存的数据,获取新的过期时间。反之返回200就相当于重新请求了一遍资源并替换旧资源。

Last-modified/If-Modified-Since

Last-modified: 服务器端资源的最后修改时间,响应头部会带上这个标识。第一次请求之后,浏览器记录这个时间,再次请求时,请求头部带上If-Modified-Since即为之前记录下的时间。服务器端收到带If-Modified-Since的请求后会去和资源的最后修改时间对比。若修改过就返回最新资源,状态码200,若没有修改过则返回304

HTTP缓存机制的原理

Etag/If-None-Match

由服务器端上生成的一段hash字符串,第一次请求时响应头带上ETag: abcd,之后的请求中带上If-None-Match: abcd,服务器检查ETag,返回304200

关于 last-modified 和 Etag 区别

  • 某些服务器不能精确得到资源的最后修改时间,这样就无法通过最后修改时间判断资源是否更新。

  • Last-modified只能精确到秒。

  • 一些资源的最后修改时间改变了,但是内容没改变,使用Last-modified看不出内容没有改变。

  • Etag的精度比Last-modified高,属于强验证,要求资源字节级别的一致,优先级高。如果服务器端有提供ETag的话,必须先对ETag进行Conditional Request

注意:实际使用ETag/Last-modified要注意保持一致性,做负载均衡和反向代理的话可能会出现不一致的情况。计算ETag也是需要占用资源的,如果修改不是过于频繁,看自己的需求用Cache-Control是否可以满足。

实际应用

首先要明确哪些内容适合被缓存哪些不适合。

考虑缓存的内容:css样式文件,js文件,logo、图标,html文件,可以下载的内容一些不应该被缓存的内容:业务敏感的GET请求

可缓存的内容又分为几种不同的情况:

不经常改变的文件:给max-age设置一个较大的值,一般设置max-age=31536000比如引入的一些第三方文件、打包出来的带有hash后缀cssjs文件。一般来说文件内容改变了,会更新版本号、hash值,相当于请求另一个文件。 标准中规定max-age的值最大不超过一年,所以设成max-age=31536000。至于过期内容,缓存区会将一段时间没有使用的文件删除掉。

到此,关于“HTTP缓存机制的原理”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

HTTP缓存机制的原理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

http缓存技术的原理

本篇内容主要讲解“http缓存技术的原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“http缓存技术的原理”吧!HTTP缓存实现的原理浏览器是如何知道使用缓存的,其实这都是通过http中,浏览
2023-06-05

什么是HTTP的缓存机制

这篇文章给大家介绍什么是HTTP的缓存机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。缓冲机制普遍存在,有客户端缓存、服务端缓存、代理服务器缓存等。浏览器缓存是在HTTP中起缓存作用的。HTTP缓存作为优化web性能
2023-06-25

shiro中缓存机制的原理是什么

本篇文章给大家分享的是有关shiro中缓存机制的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实
2023-05-31

探索HTTP缓存机制:了解常见的缓存策略

解密HTTP缓存机制:你知道有哪些常见的缓存策略吗?HTTP缓存机制是Web开发中非常重要的一部分,它可以提高网站的性能和用户体验。通过缓存,用户可以更快地加载网页内容,并减轻服务器的负载。然而,为了正确地使用缓存机制,我们需要了解其中的
探索HTTP缓存机制:了解常见的缓存策略
2024-01-23

redis缓存存储Session原理机制是什么

这篇文章主要讲解了“redis缓存存储Session原理机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis缓存存储Session原理机制是什么”吧!基于 Redis 存储 S
2023-06-25

掌握常见的缓存机制以提高HTTP缓存效率

高效利用HTTP缓存:掌握常用的缓存机制有哪些?引言:在网络应用中,为了提升用户体验和减少网络资源消耗,缓存技术是一个非常重要的组成部分。HTTP缓存机制是其中一种常用的缓存技术,通过在客户端和服务器之间保存资源的副本,可以有效减少网络请
掌握常见的缓存机制以提高HTTP缓存效率
2024-01-23

redis缓存清理机制

redis 缓存清理机制通过采取淘汰策略、内存溢出策略和手动淘汰来释放空间,以便容纳新数据。常用的淘汰策略包括 lru、lfu、fifo;内存溢出策略包括 volatile-lru、volatile-lfu、allkeys-lru。此外,r
redis缓存清理机制
2024-04-20

redis清理缓存机制

redis 提供了多种清理缓存机制,包括:定期过期策略 (ttl):为键设置生存时间,到期后自动删除。最近最少使用 (lru) 算法:删除最近最少使用的键,优先保留最近使用的键。定期清理任务:配置定时任务以定期清除缓存数据。手动清理:使用
redis清理缓存机制
2024-04-20

redis的缓存机制

redis提供了一种高效的缓存机制,使用键值对结构存储数据,并使用不同的数据结构来优化不同类型数据存储。当缓存达到容量限制时,它使用各种淘汰策略(如lru、lfu、ttl)来淘汰数据。redis缓存机制的优势包括提高应用程序性能、减少延迟、
redis的缓存机制
2024-04-19

二级缓存的更新机制原理和实施方式

二级缓存更新机制的原理及实现方式一、引言随着计算机技术的发展,数据处理和存储需求的增加,对于系统性能的要求也越来越高。为了提高系统的运行效率,缓存技术应运而生。而在缓存技术中,二级缓存是一种重要的组成部分。本文将介绍二级缓存更新机制的原理
二级缓存的更新机制原理和实施方式
2024-01-30

WCF缓存机制怎么理解

这篇文章主要讲解了“WCF缓存机制怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WCF缓存机制怎么理解”吧!缓存是很占内存的,缓存也有它的好处,这里就WCF缓存机制分析一个案例,希望
2023-06-17

NHibernate缓存管理机制怎么理解

这篇文章主要介绍“NHibernate缓存管理机制怎么理解”,在日常操作中,相信很多人在NHibernate缓存管理机制怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”NHibernate缓存管理机制怎
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录