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

http缓存技术的原理

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

http缓存技术的原理

本篇内容主要讲解“http缓存技术的原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“http缓存技术的原理”吧!

HTTP缓存实现的原理

浏览器是如何知道使用缓存的,其实这都是通过http中,浏览器将最后修改时间发送请求给web服务器,web服务器收到请求后跟服务器上的文档最后修改的时间对比,如果web服务器上最新文档修改时间小于或者等于浏览器发送过来的,则发送304给浏览器,使用缓存版本。

缓存的概念

缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存, 等等。

http中具有缓存功能的是浏览器缓存,以及缓存代理服务器。

http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。

缓存的好处

缓存的好处是显而易见的, 好处有,

减少了冗余的数据传输,节省了网费。

减少了服务器的负担, 大大提高了网站的性能

加快了客户端加载网页的速度

Fiddler可以方便地查看缓存的header

Fiddler中把header都分门别类的放在一起,这样方便查看。

http缓存技术的原理

如何判断缓存新鲜度

Web服务器通过2种方式来判断浏览器缓存是否是最新的。

第一种, 浏览器把缓存文件的最后修改时间通过 header ”If-Modified-Since“来告诉Web服务器。

第二种, 浏览器把缓存文件的ETag, 通过header "If-None-Match", 来告诉Web服务器。

通过最后修改时间, 来判断缓存新鲜度

浏览器客户端想请求一个文档,  首先检查本地缓存,发现存在这个文档的缓存,  获取缓存中文档的最后修改时间,通过: If-Modified-Since, 发送Request给Web服务器。

Web服务器收到Request,将服务器的文档修改时间(Last-Modified): 跟request header 中的,If-Modified-Since相比较, 如果时间是一样的, 说明缓存还是最新的, Web服务器将发送304 Not Modified给浏览器客户端, 告诉客户端直接使用缓存里的版本。如下图。

http缓存技术的原理

假如该文档已经被更新了。Web服务器将发送该文档的最新版本给浏览器客户端, 如下图。

http缓存技术的原理

实例: 打开Fiddler, 然后打开博客园首页。然后F5刷新几次浏览器。 你会看到博客园首页也用了缓存。

http缓存技术的原理

与缓存有关的header

我们来看看每个header的具体含义。

Request

Cache-Control: max-age=0以秒为单位
If-Modified-Since: Mon, 19 Nov 2012 08:38:01 GMT缓存文件的最后修改时间。
If-None-Match: "0693f67a67cc1:0"缓存文件的Etag值
Cache-Control: no-cache不使用缓存
Pragma: no-cache不使用缓存
  

Response

Cache-Control: public响应被缓存,并且在多用户间共享,  (公有缓存和私有缓存的区别,请看另一节)
Cache-Control: private响应只能作为私有缓存,不能在用户之间共享
Cache-Control:no-cache提醒浏览器要从服务器提取文档进行验证
Cache-Control:no-store绝对禁止缓存(用于机密,敏感文件)
Cache-Control: max-age=6060秒之后缓存过期(相对时间)
Date: Mon, 19 Nov 2012 08:39:00 GMT当前response发送的时间
Expires: Mon, 19 Nov 2012 08:40:01 GMT缓存过期的时间(绝对时间)
Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT服务器端文件的最后修改时间
ETag: "20b1add7ec1cd1:0"服务器端文件的Etag值

如果同时存在cache-control和Expires怎么办呢?

浏览器总是优先使用cache-control,如果没有cache-control才考虑Expires

ETag

ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 当资源发送改变时,ETag也随之发生变化。

ETag是Web服务端产生的,然后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。

为什么使用ETag呢? 主要是为了解决Last-Modified 无法解决的一些问题。

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

某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。

一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。

实例, 打开Fiddler, 打开博客园首页。  你可以看到很多图片,或者CSS文件都是用了缓存。 这些都是通过比较ETag的值,来判断文件是否更新了。

http缓存技术的原理

浏览器不使用缓存

CTRL+F5强制刷新浏览器,或者设置IE。  可以让浏览器不使用缓存。

浏览器发送Http request, 给Web 服务器, header中带有Cache-Control: no-cache.   明确告诉Web服务器,客户端不使用缓存。

Web服务器将把最新的文档发送给浏览器客户端.

实例:

打开Fiddler, 打开博客园首页, 然后按CTRL+F5强制刷新浏览器,你将看到

http缓存技术的原理

Pragma: no-cache的作用和Cache-Control: no-cache一模一样。 都是不使用缓存。

Pragma: no-cache 是HTTP 1.0中定义的, 所以为了兼容HTTP 1.0. 所以会同时使用Pragma: no-cache和Cache-Control: no-cache

直接使用缓存,不去服务器验证

按F5刷新浏览器和在地址栏里输入网址然后回车。 这两个行为是不一样的。

按F5刷新浏览器, 浏览器会去Web服务器验证缓存。

如果是在地址栏输入网址然后回车,浏览器会"直接使用有效的缓存", 而不会发http request 去服务器验证缓存,这种情况叫做缓存命中,如下图

http缓存技术的原理

实例: 比较第一次访问博客园主页和第二次博客园主页

启动Fiddler, 用firefox打开博客园主页, 发现有50多个session。

按CTRL+X将Fiddler中的所有session删除。 关闭firefox,重新打开一个firefox,打开博客园主页。   发现只有30多个session.

分析;  少了的session是因为firefox直接用了缓存,而没有发http request。

http缓存技术的原理

如何设置IE不使用缓存

打开IE。点击工具栏上的, 工具->Internet选项->常规->浏览历史记录 设置. 选择“从不”。然后保存。

然后点击“删除”  把Internet临时文件都删掉 (IE缓存的文件就是Internet临时文件)。

http缓存技术的原理

公有缓存和私有缓存的区别

Cache-Control: public 指可以公有缓存, 可以是数千名用户共享的。

Cache-Control: private 指只支持私有缓存, 私有缓存是单个用户专用的。

http缓存技术的原理

到此,相信大家对“http缓存技术的原理”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

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

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

http缓存技术的原理

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

下载Word文档

猜你喜欢

http缓存技术的原理

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

PHP利用缓存技术提升性能技巧及原理探究

本文探讨了PHP中缓存技术的原理和应用,旨在提升应用性能。缓存技术通过存储经常访问的数据,避免重复读取和计算,从而减少数据库查询、提高响应时间和降低服务器负载。PHP支持多种缓存类型,包括内存缓存、文件缓存、对象缓存和分布式缓存。选择合适的缓存策略和遵循最佳实践对于充分利用缓存至关重要。本文提供了使用Redis、APC和OPcache扩展的示例以及最佳实践指南,帮助开发人员优化PHP应用的性能。
PHP利用缓存技术提升性能技巧及原理探究
2024-04-02

深入浅出从根上理解 HTTP 缓存机制及原理!

为什么被缓存,如何命中缓存以及缓存什么时候生效的,我们却很少在实际开发中去了解。今天小鹿借助动画形式来从根上理解 HTTP 缓存机制及原理。

PHP+Redis缓存技术一览

加入缓存技术之后,原来方法的 调用方式和返回的数据结构 都不应该改变。

PHP缓存技术的实例应用

本篇内容主要讲解“PHP缓存技术的实例应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP缓存技术的实例应用”吧!之前我们曾深入的探讨过PHP缓存技术,其中主要提到了数据缓存。数据缓存主要是
2023-06-17

本地缓存技术探索

本文主要介绍现有的主流本地缓存技术以及挑战,并提出一种自研本地缓存技术。
缓存数据库2024-11-30

PHP缓存技术的简单介绍

本篇内容介绍了“PHP缓存技术的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php缓存技术的应用时相当普遍的,也许有些人还对这项技
2023-06-17

PHP中的缓存技术是什么

本篇内容介绍了“PHP中的缓存技术是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、缓存是提高性能最好的方式,例如减少网络I/O、减少
2023-06-20

ASP.NET缓存的工作原理

这篇文章主要介绍“ASP.NET缓存的工作原理”,在日常操作中,相信很多人在ASP.NET缓存的工作原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ASP.NET缓存的工作原理”的疑惑有所帮助!接下来,请跟
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动态编译

目录