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 --- 缓存相关推荐
- Spring中启用Hibernate二级缓存步骤
1.在applicationContext.xml配置文件中SessionFactory bean中配置缓存 <!-- 配置会话工厂对象 --> <bean id="se ...
- Redis 预防缓存穿透“神器” — 布隆过滤器
1. 布隆过滤器 1.1 概念 在架构设计时有一种最常见的设计被称为布隆过滤器,它可以有效减少缓存穿透的情况.其主旨是采用一个很长的二进制数组,通过一系列的 Hash 函数来确定该数据是否存在. 布隆 ...
- 缓存击穿、缓存穿透、缓存雪崩
文章目录 多级缓存架构 缓存击穿 缓存穿透 缓存雪崩 多级缓存架构 在项目架构中,前端发送请求,服务器会先从缓存中获取数据,如果找到数据则直接返回,如果在缓存中没有找到则会去从数据库中获取,数据库取到 ...
- Redis缓存穿透击穿雪崩
目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 1.缓存穿透 概述: 缓存穿透的概念很简单,用户想要査询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库査询.发现也数据库 ...
- CPU三级缓存技术解析
CPU三级缓存技术解析 cpu存取数据 cpu存取数据大致可以认为是下图的流程(此处图比较简单) cpu拿到需要的内存地址,之后这个地址会被mmu转换成真正的物理地址,接下来会去查接下来查L1 cac ...
- Glide的缓存机制
Glide的缓存分为两个模块,一个是内存缓存,一个是硬盘缓存. 内存缓存的作用是防止应用重复将图片数据读取到内存当中: 硬盘缓存的作用是防止应用重复从网络或其他地方下载和读取数据. Glide的缓存K ...
- 内存缓存LruCache的简单使用
LruCache算法(Least Recently Used),也叫近期最少使用算法. 这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并 ...
- 最全面的缓存架构设计
一.缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...
- Cache Aside Pattern(缓存模式)
本文主要讨论这么几个问题: (1)"缓存与数据库"需求缘起 (2)"淘汰缓存"还是"更新缓存" (3)缓存和数据库的操作时序 一.需求缘起 ...
- Django 缓存6.2
缓存 对于中等流量的网站来说,尽可能地减少开销是必要的.缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源 Django自带了一个健壮的缓存系统来保存动态页面,避免对 ...
最新文章
- 图解JDK命令行工具实例教程
- OpenCV立体校准stereo calib的实例(附完整代码)
- 为学IOS,进击中...之C语言指针练习
- jedispool redis哨兵_通过java哨兵JedisSentinelPool代码示例连接对配置的redis哨兵主从模式进行测试验证...
- Matplotlib——创建散点图
- Android 圆角TabLayout
- Linux 高级流量控制
- 像人一样脑补世界!DeepMind历时一年半搞出GQN,登上Science
- python三本经典书籍-《python编程入门经典》python之父推荐这三本书让你更快入门...
- python递归函数入门教程_Python递归函数
- mysql 物化视图_Mysql物化视图应用
- tensorflow学习之(十一)RNN+LSTM神经网络的构造
- 人工势场python_ROS及SLAM进阶教程(十一)多机器人编队人工势场法协同避障算法原理及实现...
- SQLServer 2000 Service Pack 4 简体中文版
- 面包板电源线怎么接_面包板的怎么使用
- eclipse提示:This tag and its children can be replaced by one lt;TextView/gt; and a compound drawable
- NC57中间表数据源的设置流程
- switch-case 采用map+函数指针替代
- OPT液态镜头上市,视觉检测实现瞬时对焦
- 楚列斯基分解法、求矩阵范数的C++实现
热门文章
- vb excel 整行删除_Excel中常用的批量处理都不掌握,那就真的Out了
- java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式
- Games101现代图形学入门Lecture 4: Transformation Cont知识点总结
- Python缩进问题
- 机器学习之 weka学习(五)示例用法
- iOS中POST请求
- 利用SQL计算两个地理坐标(经纬度)之间的地表距离
- 发现一个小坑的地方,unity的协程,想要停止,必须以字符串启动
- windows下解决mysql5中文乱码的问题
- Autofac IoC容器基本使用步骤【1】