http --- 缓存

Web缓存:

// 是可以自动保存常见文档副本的HTTP设备.
// 当Web请求抵达缓存时,如果本地有"已缓存的"副本,就可以从本地存储设备而不是原始服务器中提取这个文档.

冗余的数据传输:

// 有很多客户端访问一个流行的原始服务器页面时,服务器会多次传输同一份文档
// 每次传递给一个客户端.这样一些相同的字节会在网络中一遍遍的传输,大 大的降低了网络的传输效率,浪费Web资源.
// 有了缓存,就可以保留第一条服务器响应的副本.

带宽瓶颈:

// 很多网络为本地网络客户端提供的带宽比远程服务器提供的带宽要宽.因此提供缓存可以提供交互的速度

缓存未命中:

// 一些到达缓存的请求可能会由于没用副本可用,而被转发给原始服务器,称为缓存未命中.

再验证:

// 原始服务器的内容可能会发生变化,缓存要不时对其进行检测,看看它们保存的副本是否仍时服务器上最新的副本
// 这些"新鲜度检测"被称为HTTP再验证

再验证命中(缓慢命中):

// 缓存对缓存的副本进行再验证时,会向原始服务器发送一个小的在验证请求.如果内容没有变化
// 服务器会以一个小的304 Not Modified进行响应.
// 只要缓存知道副本仍然有效,就会再次将副本标识为暂时新鲜的,并将副本提供给客户端,这被称作在验证命中或缓慢命中

缓存命中率:

// 缓存提供服务的请求所占的比例称为缓存命中率
// 对中等规模的Web缓存来说,40%的命中率是很合理的

字节命中率:

// 缓存提供的字节在传输的所有字节中所占的比例

私有缓存:

// 私有缓存不需要很大的存储空间,这样可以做得很小很便宜.
// Web浏览器中有内建的私有缓存---大多数浏览器都会将常用文档缓存在个人电脑的磁盘和内存中,并且允许用户区配置缓存的大小和各种设置

公有代理缓存:

// 公有缓存是特殊的共享代理服务器,被称为缓存代理服务器(caching proxy server)或常见的代理缓存(proxy cache)
// 代理缓存会从本地缓存中提供文档,或者代表用户于服务器进行联系

内容路由器:

// 有些网络结构会构建复杂的网状缓存,网状缓存中的代理缓存之间会以更加复杂的方式进行对话,做出动态的缓存通信决策
// 决定与哪个父缓存进行对话,或者决定绕开缓存,直接连接原始服务器.这种代理缓存会决定选择何种路由器对内容进行访问、管理和传送

文档过期:

// HTTP有一些简单的机制可以再不要求服务器记住有哪些缓存拥有其文档副本的情况下,保持已缓存数据与服务器之间充分一致
// HTTP将之称为文档过期.// 文档过期(Expires首部)
HTTP/1.0 200 OK
Date: Sat, 29 Jun 2002, 14:30:00 GMT
Content-type: text/plain
Content-legnth: 67
Expires: Fri, 05 Jul 2002, 05:00:00 GMTIndependence Day sale at Joe`s Hardware Come shop with us today!// Cache-Control: max-age 首部 (最大的生存时间,单位:秒)
HTTP/1.0 200 OK
Date: Sat, 29 Jun 2002, 14:30:00 GMT
Content-type: text/plain
Content-length: 67
Cache-Control: max-age=484200Independence Day sale at Joe`s Hardware Come shop with us today!

服务器再验证:

// 仅仅是已缓存文档过期了并不意味着它和原始服务器上目前处于活跃状态的文档有实际区别;只是意味着到了要进行核对的时间了.
// 这种情况称为“服务器再验证”// If-Modified-Since:Date再验证
// 条件请求
GET /announce.html HTTP/1.0
If-Modified-Since: Sat, 29 Jun 2002, 14:30:00 GMT// 响应(成功的在验证)
HTTP/1.0 304 Not Modified
Date: Wed, 03 Jul 2002, 19:18:23 GMT
Expires: Fri, 05 Jul 2002, 14:30:00 GMT// 响应(失败的再验证)
HTTP/1.0 200 OK
Date: Fri, 05 Jul 2002, 17:54:40 GMT
Content-length: 124
Expires: Mon, 09 Sep 2002, 05:00:00 GMTAll exterior house paint on sale through Labor Day.
Just Another reason for you to shop this summer at Joe`s Hardware!// If-None-Match:实体标签再验证(再某些情况下,仅使用最后修改日期再验证是不够的)
// 条件请求
GET /announce.html HTTP/1.0
If-None-Match: "v2.6"// 响应
HTTP/1.0 304 Not Modified
Date: Wed, 03 Jul 2002, 19:18:23 GMT
ETag: "v2.6"
Expires: Fri, 05 Jul 2002, 05:00:00 GMT// 强弱验证器
// 有时服务器希望对文档进行一些非实质性或不重要的修改时,不要使所有的已缓存副本都失效,
// HTTP/1.1支持"弱验证器"
// 服务器会用"W/"来标识弱验证器
ETag: W/"v2.6"
If-None-Match: W/"v2.6"

no-Store与no-Cache响应首部

Pragma: no-cache
Cache-Control: no-store
Cache-Control: no-cache
// no-store:禁止缓存对响应进行复制
// no-cache的响应在与原始服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用
// 以上2种对象是HTTP/1.1提供的,为了兼容于HTTP/1.0+,使用了Pragma: no-cache

max-age:

Cache-Control: max-age=3600
Cache-Control: s-maxage=3600
// max-age 此文档处于新鲜状态的秒数
// s-maxage 此文档处于新鲜状态的秒数,但仅适用于共享(公有)缓存// 服务器请求缓存不缓存该文档:
Cache-Control: max-age=0
Cache-Control: s-maxage = 0

Expires:

Expires: Fri, 05 Jul 2002, 05:00:00 GMT
// 实际的过期日期
// 不推荐使用的原因:许多服务器的时钟都不同步,或者不正确,所以最好用剩余秒数

must-revalidate:

Cache-Control: must-revalidate
// 原始服务器希望缓存严格遵守过期信息
// 该响应首部告诉缓存,在事先没有跟原始服务器进行再验证的情况下,不能提供对这个对象的陈旧副本

试探性过期

// 如果响应种没有Cache-Control: max-age首部,也没有Expires首部,缓存可以计算出一个试探性最大使用期
// 如果得到的最大试用期大于24小时,就应该向响应首部添加一个Heuristic Expiration WarningLM-Factor算法:
// 逻辑:
// 如果已缓存文档最后一次修改发生在很久以前,它可能会是一份稳定的文档,不太会突然发生变化 ,因此将其继续保存在缓存中
// 如果已缓存文档近期被修改过,就说明它很可能会频繁发生变化,因此在与服务器进行再验证之前,只应该将其缓存很短一段时间
// 下面是LM-factor算法的Perl伪代码:
$time_since_modify = max(0, $server_Date - $server_Last_Modified);
$server_freshness_limit = int($time_since_modify * $lm_factor);

Apache关于缓存的HTTP首部

// mod_headers
// 将某目录下的所有HTML文件都标识为非缓存
<Files * .html>Header set Cache-control no-cache
</Files>// mode_expires
// 将文档的过期日期设置为对其最后一次被访问之后或者其最近修改日期之后的某一时间
// 可以为不同的文件类型设置不同的过期日期
ExpiresDefault A3600
ExpiresDefault M86400
ExpiresDefault "access plus 1 week"
ExpiresByType text/html "modification plus 2 days 6 hours 12 minutes"

通过HTTP-EQUIV控制HTML缓存

// 让coder无需与Web服务器的配置文件进行交互,能够更容易地为所提供地HTML文档分配HTTP首部信息
// HTML2.0 定义了 <META HTTP-EQUIV>标签
<HTML><HEAD><TITLE>My Document</TITLE><META HTTP-EQUIV="Cache-control" CONNECT="no-cache"></HEAD>...
</HTML>

新鲜度算法(服务器)

sub server_freshness_limit
{local($heuristic, $server_freshness_limit,$time_since_last_modify);$heuristic = 0;if ($Max_Age_value_set) {$server_freshness_limit = $Max_Age_value;} else if ($Expires_value_set) {$server_freshness_limit = $Expires_value - $Date_value;} else if($Last_Modified_value_set) {$time_since_last_modify = max(0, $Date_value - $Last_Modified_value);$server_freshness_limit = int($time_since_last_modify * $lm_factor);$heuristic = 1;} else{$server_freshness_limit = $default_cache_min_lifetime;$heuristic = 1;}if($heuristic) {if($server_freshness_limit > $default_cache_max_lifetime) {$server_freshness_limit = $default_cache_max_lifetime;}if( $server_freshness_limit  < $default_cache_min_lifetime) {$server_freshness_limit = $default_cache_min_lifetime;}return ($server_freshness_limit);}
}

新鲜度算法(客户端)

sub client_modified_freshness_limit
{$age_limit = server_freshness_limit();if($Max_Stale_value_set) {if( $Max_Stale_value == $INT_MAX){$age_limit = $INT_MAX;} else{$age_limit = server_freshness_limit() + $Max_Stale_value;}}if( $Min_Fresh_value_set) {$get_limit = min($age_limit, server_freshness_limit() - $Min_Fresh_value_set);}if($Max_Age_value_set) {$age_limit = min($age_limit, $Max_Age_value);}
}

参考 《HTTP权威指南》第7章

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

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

相关文章

Django 下添加左侧字段显示和搜索

在对应的apps下建立xadmin.py from .models import EmailVerifyRecord import xadminclass EmailVerifyRecordAdmin(object): list_display [code,email,send_type,send_time]//字段显示 search_fields [code,email,send_type]//搜索 xadmin.site.register(EmailVerify…

免费分享老男孩全栈9期视频,共126天

免费分享老男孩全栈9期视频&#xff0c;共126天。 及时保存避免失效&#xff1a;http://mihon.cn/article/26.html/ 转载于:https://www.cnblogs.com/mihon/p/9372881.html

ES5 数组扩展方法 forEach/filter/map的使用与重写

ES3 splice slice join sort &#xff08;IE5、IE6&#xff09; 数组扩展方法 ES5&#xff08;在ES3的基础上增加、修正&#xff09; forEach 可能会改变原数组(直接操作了arr[i]&#xff0c;没有使用深拷贝)参数1&#xff1a;回调函数&#xff08;如果不使用箭头函数&#xf…

http --- 网关、隧道、中继

网关: // 作为某种翻译器使用,抽象出了一种能够到达的资源 // 应用程序可以请求网关来处理某条请求. // 在HTTP和其他协议及其应用程序之间起到接口作用FTP URL的HTTP请求: GET ftp://ftp.irs.gov/pub/00-index.txt HTTP/1.0 Host: ftp.irs.gov User-agent: SuperBrowser 4.2…

状态码

服务器向用户返回的状态码和提示信息&#xff0c;常见的有以下一些&#xff08;方括号中是该状态码对应的HTTP动词&#xff09; 200 OK - [GET]&#xff1a;服务器成功返回用户请求的数据&#xff0c;该操作是幂等的&#xff08;Idempotent&#xff09;。 201 CREATED - [POST/…

187. Repeated DNA Sequences重复的DNA子串序列

&#xff3b;抄题&#xff3d;&#xff1a; All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. Write a fun…

http --- cookie与会话跟踪

以购物网站Amazon.com为例 // (a)客户端:首次请求Amazon.com根页面 GET / HTTP/1.0 Host: www.amazon.com// (b)服务器:将客户端重定向到一个电子商务软件的URL上 HTTP/1.1 302 Found Location: http://www.amazon.com:80/exec/obidos/subst/home/redirect.html// (c)客户端:对…

ES5 every/some/reduce/reduceRight的使用与重写

被作为实参传入另一函数&#xff0c;并在该外部函数内被调用&#xff0c;用以来完成某些任务的函数&#xff0c;称为回调函数。 break、return用于终止循环的区别&#xff1a; return只能用在函数体内&#xff08;单独一个for循环里直接用return会报错&#xff09;对于多层循环…

同步异步单线程多线程初级理解

对于我开始接触同步异步单线程多线程的概念的时候&#xff0c;都是分别理解同步和异步、单线程和多线程概念&#xff0c;当看到“使用同步方法保证线程安全”时愚昧的理解为那就是单线程咯&#xff1b;于是就陷入了困惑&#xff0c;同步等于单线程吗&#xff1f;下面是我自己不…

http --- 基本认证与摘要认证

基本认证: // (a)客户端:查询 GET /cgi-bin/checkout?cart17854 HTTP/1.1// (b)服务器:质询 HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm"Shopping Cart"// (c)客户端:响应 GET /cgi-bin/checkout?cart17854 HTTP/1.1 Authorization: Basic YnJpYW4…

对栈

1331【例1-2】后缀表达式的值 #include<bits/stdc.h>using namespace std;int sta[101];char s[256]; int comp(char s[256]){ int i0,top0,x; while(i<strlen(s)-2) { switch(s[i]) { case:sta[--top]sta[top1];break; case-:sta[--top]-sta[top1];break; case*:sta[…

hive中map相关函数总结

目录 hive官方函数解释示例实战 hive官方函数解释 hive官网函数大全地址&#xff1a; hive官网函数大全地址 Return TypeNameDescriptionmapmap(key1, value1, key2, value2, …)Creates a map with the given key/value pairs.arraymap_values(Map<K.V>)Returns an un…

【前端统计图】echarts改变颜色属性的demo

一&#xff1a;柱状图改变颜色 图片.png代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!-- 柱状统计图 --><div class"row"><div …

DOM-1 DOM初探、JS对象、XML、幻灯片案例展示

DOM DOM —— Document Object Model(文档对象模型)DOM 对象 → 宿主对象&#xff08;是浏览器提供的&#xff09;通过浏览器提供的方法表示或操作HTML和XML不能操作css标签&#xff1a;<></>对元素&#xff1a;<>及内部的内容,getElementsByTagName获取的是…

http --- 密码、密钥、对称(公开)密钥加密系统、数字签名、数字证书的一些概念

密码(cipher) // 密码是一套编码方案和使用相应解码方式的结合体 // *明文:使用密码加密之前的称为明文 // *密文:使用密码进行加密的称为密文最初的密码是相当简单的,很容易就可以破解,于是产生了密码机: // 密码机可以用复杂得多得密码来快速、精确地对报文进行编码.它们可…

elasticsearch5.x:查询建议介绍、Suggester 介绍以及Java-api实现

elasticsearch5.x&#xff1a;查询建议介绍、Suggester 介绍 参考&#xff1a;http://www.cnblogs.com/leeSmall/p/9206646.html 参考(重点)&#xff1a;https://elasticsearch.cn/article/142 参考&#xff08;官网&#xff09;&#xff1a;https://www.elastic.co/guide/en/e…

DOM-2 document对象、获取元素、节点、遍历树

一、document获取元素 1. 方法 document.getElementById(‘box’) // 在IE8及以下是不分大小写的&#xff0c;而且name值也能匹配上document.getElementsByClassName(’’) // IE8及以下是用不了的document.getElementsByTagName() 都兼容document.getElementsByName() 用的非…

javascript --- js中的事件

事件实现松耦合: // JS和HTML之间的交互是通过事件实现的. // 事件,就是文档或浏览器窗口中发生一些特定的交互瞬间. // 可以使用侦听器来预定事件,以便事件发生时执行相应的代码. // 这种在传统软件工程中被称为观察员模式的模型,支持页面的行为与页面的外观之间的松耦合事件…

centos系统设置局域网静态IP

---恢复内容开始--- centos系统设置局域网静态IP 很多时候&#xff0c;我们并不希望漏油器重启之后&#xff0c;自己的服务器动态的获取IP&#xff0c;这样很不利&#xff0c;因为你可能装了mysql&#xff0c;redis&#xff0c;等软件&#xff0c;然后需要远程去访问这台服务器…

SQLServer数据库(二)

数据库设计&#xff1a;就是将数据库中的数据库实体及这些数据库实体之间的关系&#xff0c;进行规划和结构化的过程。 项目开发过程&#xff1a; 需求分析 概要设计 详细设计 代码编写 运行测试 打包发行 数据库的系统分析基本步骤&#xff1a;收集信息、标识实体、标识每个实…