HTTP协议 (四) 缓存

Apache服务器配置:启用Gzip压缩和设置Expire/Cache-Control头 在Apache服务器上启用Gzip压缩和配置Expire/Cache-Control头可以显著提高网站的性能和加载速度。通过启用Gzip压缩,服务器可以将传输给客户端的数据进行压缩,减小数据的大小,从而减少网络传输时间。而通过设置Expire/Cache-Control头,服务器可以指定客户端缓存文件的时间,减少对服务器的请求,同时提供更好的用户体验。这将有效地减小传输数据的大小并设置适当的缓存时间,从而提高网站的性能和加载速度。请注意,上述配置示例中的文件类型和缓存时间仅作参考。 阅读详情
之前写过一个篇 【HTTP协议详解】 ,这次继续介绍HTTP协议中的缓存机制。HTTP协议提供了非常强大的缓存机制, 了解这些缓存机制,对提高网站的性能非常有帮助。 本文介绍浏览器和Web服务器之间如何处理" 浏览器缓存",以及 控制缓存的http header.

本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这工具,可以先参考[Fiddler教程] 。在看本文的时候, 请务必打开Fiddler来实践。


阅读目录

  1. 缓存的概念
  2. 缓存的好处
  3. Fiddler可以方便地查看缓存的header
  4. 如何判断缓存新鲜度
  5. 通过最后修改时间,判断缓存新鲜度
  6. 与缓存相关的header
  7. ETag
  8. 浏览器不使用缓存
  9. 直接使用缓存,不去服务器端验证
  10. 如何设置IE不使用缓存
  11. 公有缓存和私有缓存的区别

 

缓存的概念

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

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

 

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

缓存的好处

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

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

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

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

 

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

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

 

如何判断缓存新鲜度

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

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

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

 

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


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

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

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

 

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

 

与缓存有关的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 无法解决的一些问题。

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

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

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

 

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

 

浏览器不使用缓存

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

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

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

 

实例:

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

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 去服务器验证缓存,这种情况叫做缓存命中,如下图

 

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

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

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

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

 

 

如何设置IE不使用缓存

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

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

 

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

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

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

基于Transformers库的BERT模型:一个文本情感分类的实例解析 简介 本文来讲述BERT应用的一个例子,采用预训练好的BERT模型来进行演示。BERT的库来源于Transformers,这是一个由PyTorch编写的库,其集成了多个NLP领域SOTA的模型,比如bert、gpt-2、transformer xl等,并且可以自由选择已经预训练好的模型参数,我们可以基于这些参数进行进一步的训练调试。 Part 1: 利用BERT基于特征的方式进行建模 1、任务与数... 阅读详情

相关推荐

QTest 单元测试框架及单元测试思考

qt 单元测试框架 QTEST 及思考

一个老菜鸟的学习分享 1万+

宝塔控制面板Nginx反向代理该死的缓存

https://www.bt.cn/http://宝塔控制面板官网 编辑配置文件 location / { proxy_pass http://localhost:8083; proxy_set_header Host $host; #解决 499 服务端超时客户端强制关闭 proxy_ignore_client_abort on; #如果expires 和 add_header 同时开启的情况下,则add_header优于expi...

黄猿帅的博客 3584

Android11,无障碍服务模拟多手势使用dispatchGesture时总是onCancelled

AccessibilityService的dispatchGesture去模拟多手势,总是onCancelled的一种解决办法

m0_49953943的博客 2102

HTTP缓存协议实战

一、什么是缓存 缓存,又称作Cache,我们把临时存储数据的地方叫做缓存池,缓存池里面放的数据就叫做缓存。当用户需要使用这些数据,首先在缓存中寻找,如果找到了则直接使用。如果找不到,则再去其他数据源中查找。 二、为什么要使用缓存技术 缓存的本质就是用空间换时间,以临时存储的数据暂时代替数据源中读取最新的数据,这种方式带来的好处在不同的场景下是不一样的。 举个例子: 当我们需要喝水时,我们会拿出一个水杯,去水龙头接一杯水来喝。大家可以思考一下,为什么用杯子来喝水,而不是直接用嘴巴在水龙头接水喝。

分享Java技术知识,共同成长进步! 2277

海康摄像头RTSP流延迟优化实战:从VLC到OpenCV的5种方案对比与性能调优

本文针对海康摄像头RTSP流的高延迟问题,深入剖析了延迟根源,并系统对比了从VLC、OpenCV到海康官方SDK、FFmpeg及硬件加速等五种主流方案的性能表现。重点分享了缓冲区设置、协议优化、多线程架构与硬件解码等实战调优技巧,旨在帮助开发者将视频流延迟从秒级优化至毫秒级,满足工业检测、安防监控等高实时性场景需求。

hh234的博客 805

别再瞎改注册表了!实测Win10/Win11远程桌面60帧的正确姿势(附ToDesk对比)

本文深入解析Windows远程桌面60帧优化的科学方法,揭示常见误区并提供实测有效的解决方案。从版本差异到硬件加速,再到第三方工具对比(如ToDesk),帮助用户避开无效的注册表修改,实现流畅的远程桌面体验。

weixin_33738555的博客 341

浅谈浏览器http的缓存机制

针对浏览器的http缓存的分析也算是老生常谈了,每隔一段时间就会冒出一篇不错的文章,其原理也是各大公司面试时几乎必考的问题。 之所以还写一篇这样的文章,是因为近期都在搞新技术,想“回归”下基础,也希望尽量总结的更详尽些。 那么你是否还需要阅读本篇文章呢?可以试着回答下面这个问题: 我们在访问百度首页的时候,会发现不管怎么刷新页面,静态资源基本都是返回 200(from cache)...

dcof99817的博客 339

手撕代码系列:Conv2D

在实际的神经网络中,每个卷积核都会对应一个偏置值。这意味着如果网络有多个卷积核,每个卷积核的输出都可以加上对应的偏置。

qq_55794606的博客 909
上一篇: HTTP协议 (三) 压缩
下一篇: HTTP协议 (六) 状态码详解
Johnny__Tang
博客等级 码龄18年 9粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值