HTTP 缓存介绍

HTTP 缓存介绍

2种方式来提升你的web 应用程序的速度:

1、减少请求和响应的往返次数
2、减少请求和响应的往返字节大小

HTTP缓存是最好的减少客户端服务器端往返次数的办法。缓存提供了提供一种机制来保证客户端 或者代理能够存储一些东西,而这些东西将会在稍后的HTTP 响应中用到的。(即第一次请求了,到了客户端,缓存起来,下次如果页面还要这个JS文件或者CSS文件啥的,就不要到服务器端去取下来了,但是还是要去服 务器上去访问一次,因为请求要对比ETAG值,关于这个值,我将会在下次翻译中介绍其作用)这样,就不用让文件再次跨越整个网络了。

缓存相关的请求头 
为了提高性能,微软的IE和其他的web客户端总是想尽办法来维持从远程服务器上下载下来的本地的缓存。
当客户端需要一个资源(html,css.js…),他们有3种可能的动作:
1 发送一个一般的HTTP请求到远程服务器端,请求这个资源。
2 发送一个有条件的HTTP请求到服务器,条件就是如果它不同于本地的缓存版本。
3 如果缓存的拷贝可用,就使用本地的缓存资源。

当发送一个请求,客户也许会使用如下的几个HEADER
Table 1. Client Cache Headers

Pragma: no-cache | The client is unwilling to accept any cached responses from caches along the route and the origin server must be contacted for a fresh copy of the resource.

If-Modified-Since: datetime | The server should return the requested resource only if the resource has been modified since the date-time provided by the client.

If-None-Match: etagvalue | The server should return the requested resource if the ETAG of the resource is different than the value provided by the client. An ETAG is a unique identifier representing a particular version of a file.

解释:
1 Pragma:no-cache 表明客户端不愿意接受缓存请求,它需要的是最即时的资源。
2 If-Modified-Since: datetime 表明如果这个资源自从上次被客户端请求,就已经修改了,那么服务器就会返回给客户端最新的。
3 If-None-Match: etagvalue 如果客户端资源的ETAG值跟服务器端不一致了,那么服务器端返回最新的资源。ETAG就是一个唯一的ID,用来表示一个文件的一个特定的版本。

如果要是这些有条件的请求,也就是含有If-Modified-Since 或者 If-None-MatchHeader头的请求,服务器将会以HTTP/304 Not Modified 来作为响应,那么客户端就知道可以使用客户端的缓存了。否则,服务器将会返回一个新的响应并且客户端就会抛弃过期的缓存资源。
你可以观察2个连贯的请求,来请求同一个图片,你会在Fiddler中发现:在第一个本地缓存 版本中,服务器返回一个含有ETAG的文件,和一个含有最后修改日期的文件,在这个第一次的请求会话中,一个本地的缓存版本已经可以使用了。这样一来,一 个有条件的请求就被创建出来。然后你再次请求这个图片的时候,他就就会响应一个本地缓存的文件,当然前提是第一次缓存的图片的ETAG值或者If- Modified-Since 值跟服务器上匹配的话,服务器就响应一个304给客户端。

Session #1
GET /images/banner.jpg HTTP/1.1
Host: www.bayden.com

HTTP/1.1 200 OK
Date: Tue, 08 Mar 2006 00:32:46 GMT
Content-Length: 6171
Content-Type: image/jpeg
ETag: "40c7f76e8d30c31:2fe20"
Last-Modified: Thu, 12 Jun 2003 02:50:50 GMT

Session #2
GET /images/banner.jpg HTTP/1.1
If-Modified-Since: Thu, 12 Jun 2003 02:50:50 GMT
If-None-Match: "40c7f76e8d30c31:2fe20"
Host: www.bayden.com

HTTP/1.1 304 Not Modified

因为一个HTTP304响应仅仅包含头,没有body,所有它在穿越互联网的时候要比携带了资源的快很多,尽管如此,HTTP/304响应需要一个服务器的往返,但是通过细心的设置响应头,web程序员可以消除这种因素,甚至是有条件的请求。

缓存相关响应头
通常缓存机制是由响应头来控制的。HTTP规范描述了Header控制缓存,The optional Cache-Control,Expires(过期)。
Expires头包含一个绝对的日期,当超过此日期,它将不会被考虑更新了。

Table 2. Common Cache-Control Headers

public :The response may be stored in any cache, including caches shared among many users. 
private :The response may only be stored in a private cache used by a single user. 
no-cache :The response should not be reused to satisfy future requests. 
no-store :The response should not be reused to satisfy future requests, and should not be written to disk. This is primarily used as a security measure for sensitive responses.
max-age=#seconds :The response may be reused to satisfy future requests within a certain number of seconds. 
must-revalidate :The response may be reused to satisfy future requests, but the origin server should first be contacted to verify that the response is still fresh.

Cache-Control头的参数设置:
Public 响应会被缓存,并且在多用户间共享。
Private 响应只能够作为私有的缓存,不能再用户间共享。
No-cache 响应不会被缓存
No-store 响应不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。
Max-age=#seconds 响应将会某个指定的秒数内缓存,一旦时间过了,就不会被缓存。
Must-revalidate 响应会被重用来满足接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的。

如果你发现你经常在你的网站上更新文件,但是并没有更改文件名字,那你就必须要非常小心地设置 你的缓存生存时间。例如:如果你要一个thisyear.gif图片文件显示当前的年份在网站上,你需要保证这个缓存过期时间不能超过一天,否则一个用户 在12月31号访问你的网站的时候,在1月1号就不能显示正确的日期。
由于某些原因,服务器可能会设置:Progma:no-cache 头,Cache-control:no-cache
Header中的参数:Vary 是一个缓存信号,Vary:User-Agent表示缓存当前的响应,但是仅限于当发送同样的User-Agent 头的时候。指令 Vary:* 就相当于Cache-Control:no-Cache。
Vary就相当于asp.net中的缓存的参数一样,意思是根据什么来缓存,如果要是知道asp.net的缓存的使用方法,就很容易明白这个参数的意思。

如果响应不包含expires或者cache-control,那么客户端就会被迫作为一个有条件的请求,来保证所有的资源都是最新的。

有条件的请求和WininetCache
IE通过Microsoft windows Internet Services来最大程度的利用缓存服务。WinInet允许用户配置缓存的大小和行为,设置缓存进行如下操作:
1 打开IE,
2 工具选项,选择Internet选项,在一般子选项中,临时文件夹内,点击设置

HTTP压缩
目前流行的WEB服务器和浏览器都提供HTTP压缩支持。HTTP压缩可以非常显著地降低客户端和服务器端的通讯量。节省超过50%的HTML,XML,CSS,JS等文件。

一个浏览器发送一个信号给服务器,他可以介绍HTTP压缩过的内容,并且会把客户端所支持的压缩类型放在请求的Header中,

例如:考虑如下的请求:
GET / HTTP/1.1 
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Host: search.msn.com
这个Accept-Encoding头表明IE将愿意接受GZIP格式的和DEFLATE格式的压缩响应。

相应的响应如下:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/6.0 --Microsoft-HTTPAPI/1.0X-Powered-By: ASP.NET
Vary: Accept-Encoding
Content-Encoding: gzipDate: Tue, 15 Feb 2006 09:14:36 GMT
Content-Length: 1277
Connection: close
Cache-Control: private, max-age=3600

实验表明,使用HTTP压缩能大量减少数据往返,一个普通的CSS文件甚至能减少80%!当然压缩是以牺牲CPU性能为代价的。特别是压缩动态文件,但是一般的权宜之策是压缩例如JS,CSS等静态文 件,因为他们在第一次压缩后,就会被存储在服务器上,如果要压缩asp.net动态文件,一定要有个权衡才行。

转载于:https://www.cnblogs.com/zhuolaiqiang/archive/2011/04/19/2072276.html

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

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

相关文章

json 查询 java_怎样在java中查询mysql得到如下的json格式的结果?

设唯一标识用户的是idString jsonString "{";preparedStatement connection.prepareStatement("select name,url,page from table_a where id 1 limit 1");ResultSet rs preparedStatement.executeQuery();rs.first();String name rs.getString(1);St…

谈谈女友卸妆后的感受?

1 2 医生和她的实习助手3 那个,打针的话能不能轻点呀4 ok,学会了 图自青鲤5 有点甜~6 一个人可以无聊到什么程度?7 所谓的前翻乾坤无敌轮回抓鱼大法。。8 《请回答1988》中的珍珠饰演者金雪演唱插曲《惠化洞》(来源于weibo&#x…

隐藏无线网络技巧

无线信号一搜即到,无线网络一连即上,这是很多安全隐患的根源,没有一定的保护措施,无线网络犹如毫无遮挡在市井裸奔,所以在无线网络中隐藏电脑和无线路由器非常重要。想深度潜水,请看无线网络隐藏技巧。 要在…

隐形材料你见过吗?

1 提前锻炼,为春运做准备2 隐形的聚合物3 黄山西海地轨电车好像驶入了画中.....4 大猪蹄子,就是喜欢年轻的5 现在的小学生太会了吧!6 当狗穿上了鞋,脚就不是自己的脚了~7 你仿佛在说我是王八???…

正则笔记

今天有个需求是 [无限个字符除了中文][无限个字符除了中文][无限个字符除了中文] 于是我写了个 ^[[][^u4e00-u9fa5]*[]][-*/%][[][^u4e00-u9fa5]*[]][-*/%][[][^u4e00-u9fa5]*[]]$ 报错 invalid range in character class 先不说语法问题,光是这一大坨玩意就让…

java中可以用浮点作为循环变量吗_Java千问:Java循环语句的几个冷门知识点你都知道吗?...

我们在进行Java开发的时候,经常会用到循环结构,但是有几个关于循环的“冷门”知识点,不知道你是不是都已经掌握了呢?我们一起来看看一、大括号可以不写吗?我们都知道,如果每次循环过程中要执行的语句只有一…

各个大学的录取通知书,哪个颜值最高?

近段时间,各大高校纷纷开始晒出自家的录取通知书,快来和小天一起评评哪家的颜值最高!北京工业大学北京科技大学东南大学复旦大学哈尔滨工业大学南京农业大学南开大学清华大学天津大学西安交通大学中国传媒大学北京航空航天大学这不仅仅是一纸…

java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...

最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下,便于大家观看,也便于加深自己学习…

有关堆栈溢出(in vs 2005)的读书笔记--堆栈中 申请大数组

部分原创 66下一步 Vs 堆栈 理论修改的上限是多少 ? 问题2: 全局变量去 最大的上限是多少? 堆栈(休养版本测试) 2012年3月31日17:31:27 3月 从 10^5到 10^6数组,导致vs… 当前:搭好脚手架…

烧脑又过瘾!这个被严重低估的学习方法,看完瑟瑟发抖!

▲ 点击查看科学家曾在基于脑科学和认知科学后得出一个“学习的金字塔”理论。就是下面这张图:最顶端的就是我们所谓的“知识”,但为了可以达到这个顶端,下面有一系列的支撑能力。而引申出来的核心概念,就叫“玩中学”。不要想当然…

java中统计括号配对_括号配对问题(C语言或JAVA语言代码)

描述现在,有一行括号序列,请你检查这行括号是否配对。输入第一行输入一个数N(0"]", "(", ")" 四种字符输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出…

arguments.callee()事例 参数检验

<script>var abcfunction(x){if(x<2) return 1;else return x*arguments.callee(x-1);}var yabc(5);alert(y); </script>参数检验 <script>function check(args){var actualargs.length; //实际的参数长度var expectedargs.callee.length; …

Docker基础操作命令与常用容器创建

常用操作命令 docker search docker pull docker save docker load docker rm/rmi docker ps docker images docker create --name 容器 ... docker container ls docker stop/start/pause/unpause 容器名 docker exec -it 容器名 运行命令&#xff08;如&#xff1a;bash,red…

java号段_JAVA手机号正则(多号段)

import java.util.regex.Pattern;/*** author: Lindsay* Date: 2018/9/19 16:23* Description: 手机号正则*/public class PhoneRegUtils {/*** 是否是合法的手机号** param phone* return*/public static boolean isLegalPhoneNumber(String phone) {/*** 中国电信&#xff1a…

hdu 1863(最小生成树kruskal)

/*Name: hdu1863畅通工程 Author: Try86Date: 10/04/12 12:43Description: 最小生成树(kruskal) */ #include <cstdio> #include <iostream>using namespace std;const int M 5050;int p[M], sum; //sum统计顶点个数 struct edge {int a;int b;int w; }e[M];int…

java第二版课后题答案_Java语言程序设计第2版第16章 课后习题答案

《Java语言程序设计第2版第16章 课后习题答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《Java语言程序设计第2版第16章 课后习题答案(62页珍藏版)》请在人人文库网上搜索。1、第1章 Java语言概述选择题1-1 在下列概念中&#xff0c;Java语言只保留了(B)A. 运算符…

为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?

全世界只有3.14 % 的人关注了爆炸吧知识手机电量这玩意一直都是个玄学问题。为什么我的小手机&#xff0c;最后 1% 的电量最耐用&#xff0c;每次都够我看完一个十分钟的视频。又或者是为什么我的小手机&#xff0c;最后 10% 的电量很不耐用。。。每次电池报警还有 10% 的电量&…

HP 1020

HP 1020 先卸三颗螺丝 两根铁销 把盖子拔出 弹簧拔出 把硒鼓一分为二&#xff0c;有感光器的为废粉&#xff0c;倒出来&#xff0c;搽干净感光器 另外一个倒入干净的粉&#xff0c;小心不要把齿轮那面拆开了 倒好粉&#xff0c;合起来 合起来要先扣上弹簧&#xff0c;再按上盖…

使用identity+jwt保护你的webapi(三)——refresh token

前言上一篇已经介绍了identity的注册&#xff0c;登录&#xff0c;获取jwt token&#xff0c;本篇来完成refresh token。开始开始之前先说明一下为什么需要refresh token。虽然jwt token有很多优点&#xff0c;但是它的缺点也是非常明显。由于jwt无状态的特性&#xff0c;所以j…

窗体的关闭事件

对于关注对 Windows 窗体应用程序中引发的每个事件按次序进行处理的开发人员来说&#xff0c;事件引发的顺序特别重要。 当 Windows 窗体应用程序启动时&#xff0c;主窗体的启动事件按以下顺序引发 1、System.Windows.Forms.Control.HandleCreated    在为控件创建句柄时发生…