细说缓存

这里主要讲一下Web缓存,Web缓存是可以自动保存常见文档副本的HTTP设备。当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档。缓存的好处有以下几点:

1.      减少冗余的数据传输,节省网络费用;

2.      缓解网络瓶颈问题,不需要更多带宽就能更快加载页面;

3.      降低了对服务器的要求,使得服务器可以更快响应;

4.      降低了距离时延。

缓存分为私有缓存和公有缓存。私有缓存是个人的缓存,包含了单个用户最常用的页面;公有缓存中包含了某个用户团体的常用页面。

私有缓存不需要很大的存储空间,浏览器中往往就有自建的私有缓存。而公有缓存是特殊的共享代理服务器,代理缓存会从本地缓存中提供文档或者代表用户与服务器进行联系。

下面介绍对一条HTTP GET报文的基本缓存处理过程:

1.      接收,缓存从网络中读取抵达的请求报文;

2.      解析,缓存对报文进行解析,提取出URL和各种首部;

3.      查询,缓存查看是否有本地副本可用,如果没有,就获取一份副本,并将其保存在本地;

4.      新鲜度检验,缓存查看已缓存副本是否足够新鲜,如果不是,则询问服务器是否有任何更新;

5.      创建响应,缓存会用新的首部和已缓存的主体来构建一条响应报文;

6.      发送,缓存通过网络将响应发回客户端;

7.      日志,缓存可选地创建日志来描述这个事务。

如图:

Cache-Control:max-age 用来说明多长时间内将这些内容视为新鲜的。在缓存文档过期之前,缓存可以以任意频率使用这些副本,而无需与服务器联系。

过期响应首部如下:

服务器再检验

一旦已缓存文档过期,缓存就必须和服务器进行核对。这里需要注意一点,就是仅仅过期并不意味着该缓存文档就和服务器上的文档不一样,所以还需要进行核对。这就叫做服务器再验证。

如何进行再验证呢?这个时候就可以利用HTTP的条件方法了,请求服务器只有在文档和缓存中不同时,才发送主体。5个条件方法中有两个适用于该场景,

最常见的缓存再验证首部是If-Modified-Since。只有自从某个日期之后资源发送了变化的时候,该请求才会指示服务器执行请求。如果自指定日期后,文档被修改了,GET就会成功执行。如果文档没有被修改,就会返回客户端一个304 Not Modified响应报文,为了提高有效性,不会返回主体。如下图:

有些情况下,仅仅使用If-Modified-Since还不够。比如有些文档可能被修改了,但是所做的修改并不重要比如是注释子类的,那么就不需要世界范围内的缓存都重新装载一次。这个时候,就可以利用If-None-Match了。对实体标签进行比较。实体标签是附加到文档上的任意标签或者引用字符串。和上面一样,如果未改变同样返回304,如下图:

下图是百度的缓存例子

可以看到响应中的etag和请求中的标签一致。

缓存控制

可以通过对Web服务器的配置来控制。也有一种简单的办法就是在网页中添加<META HTTP-EQUIV>标签来指定过期时间,如下图:

但是这样的效果并不好,因为至此该标签的浏览器使用Cache-Control规则可能会与代理缓存所用的规则不一样,导致发生混乱。所以经过正确配置服务器发送HTTP首部来交流对文档的缓存控制的唯一可靠的方法。

cookie

cookie是当前识别用户,实现持久会话最好的方式。cookie可以分为两类:会话cookie和持久cookie。会话cookie是一种零时cookie,它记录了用户访问站点时的设置和偏好,用户退出浏览器时,会话cookie就会删除。持久cookie生存时间较长,它存储在硬盘上。两者的区别就在于它们的过期时间,如果设置了Discard参数,或者没有设置Expires和Max-Age参数,这个cookie就是一个会话cookie。举个例子:

该响应头中的cookie就是持久cookie。

时间: 2024-10-19 01:46:07

细说缓存的相关文章

【转】使用缓存的9大误区(上)

原文连接 http://www.infoq.com/cn/articles/misunderstanding-using-cache 如果说要对一个站点或者应用程序经常优化,可以说缓存的使用是最快也是效果最明显的方式.一般而言,我们会把一些常用的,或者需要花费大量的资源或时间而产生的数据缓存起来,使得后续的使用更加快速. 如果真要细说缓存的好处,还真是不少,但是在实际的应用中,很多时候使用缓存的时候,总是那么的不尽人意.换句话说,假设本来采用缓存,可以使得性能提升为100(这里的数字只是一个计量

使用缓存的9大误区

如果说要对一个站点或者应用程序经常优化,可以说缓存的使用是最快也是效果最明显的方式.一般而言,我们会把一些常用的,或者需要花费大量的资源或时间而产生的数据缓存起来,使得后续的使用更加快速. 如果真要细说缓存的好处,还真是不少,但是在实际的应用中,很多时候使用缓存的时候,总是那么的不尽人意.换句话说,假设本来采用缓存,可以使得性能提升为100(这里的数字只是一个计量符号而已,只是为了给大家一个“量”的体会),但是很多时候,提升的效果只有80,70,或者更少,甚至还会导致性能严重的下降,这个现象在使

使用缓存的9个误区(上)(转载)

如果说要对一个站点或者应用程序经常优化,可以说缓存的使用是最快也是效果最明显的方式.一般而言,我们会把一些常用的,或者需要花费大量的资源或时间而产生的数据缓存起来,使得后续的使用更加快速. 如果真要细说缓存的好处,还真是不少,但是在实际的应用中,很多时候使用缓存的时候,总是那么的不尽人意.换句话说,假设本来采用缓存,可以使得性能提升为 100(这里的数字只是一个计量符号而已,只是为了给大家一个“量”的体会),但是很多时候,提升的效果只有 80,70,或者更少,甚至还会导致性能严重的下降,这个现象

[转]使用缓存的9大误区(上)

如果说要对一个站点或者应用程序经常优化,可以说缓存的使用是最快也是效果最明显的方式.一般而言,我们会把一些常用的,或者需要花费大量的资源或时间而产生的数据缓存起来,使得后续的使用更加快速. 如果真要细说缓存的好处,还真是不少,但是在实际的应用中,很多时候使用缓存的时候,总是那么的不尽人意.换句话说,假设本来采用缓存,可以使得性能提升为100(这里的数字只是一个计量符号而已,只是为了给大家一个“量”的体会),但是很多时候,提升的效果只有80,70,或者更少,甚至还会导致性能严重的下降,这个现象在使

细说 ASP.NET控制HTTP缓存[转]

阅读目录 开始 正常的HTTP请求过程 缓存页的请求过程 缓存页的服务端编程 什么是304应答? 如何编程实现304应答 如何避开HTTP缓存 在上篇博客[细说 ASP.NET Cache 及其高级用法]中, 我给大家介绍了ASP.NET Cache,这种服务端使用的缓存API .在我们开发一个ASP.NET网站的过程中,其实有很多地方都是可以使用缓存的, 只是由于ASP.NET是一种基于服务端的开发平台,自然我们也经常在服务端的代码中使用各类缓存技术, 然而,由于WEB应用程序的服务对象是客户

细说ASP.NET Core静态文件的缓存方式

2016-11-26 张磊 dotNET跨平台 一.前言 我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存.服务器缓存.CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的. 本文指在这三个方面,在ASP.NET Core中静态文件的实现过程和使用方法进行阐述.当然也可以考虑使用反向代理的方式(例如IIS或Nginx),这些不是本文讨论的内容. 本文重点展示如何通过StaticFileMiddleware中间件,提高网站的性能.虽然这不是唯一缓存文件的方式,我

PHP memcache 内存缓存 数据库查询 应用 高洛峰 细说PHP

PHP memcache在数据库查询中应用,减少连接数据库的次数,降低服务器的压力! /*  * memcache应用说明 memory cache 内存缓存  * 工作原理  *  服务器端口port 11211    * MemCached 存取键值对key => value  * 1.内网访问  * 2.设置防火墙  */           //创建memcache对象         $mem  =  new  Memcache();                  //连接memc

使用redis缓存加索引处理数据库百万级并发

使用redis缓存加索引处理数据库百万级并发 前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据,这里不再细说.我大概的做法是这样的,编码使用多线程访问我的数据库,在访问数据库前先访问redis缓存没有的话在去查询数据库,需要注意的是redis最大连接数最好设置为300,不然会出现很多报错. 贴一下代码吧 1 2 3 4 5 6 7 8 9 10 1

细说.NET 中的多线程 (一 概念)

为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在不同的线程中进行. 效率原因 应用程序经常需要等待一些资源,如等待网络资源,等待io资源,等待用户输入等等.这种情况下使用多线程可以避免CPU长时间处于闲置状态. 用户态,内核态 线程内的资源有两种运行态,即用户态和内核态.某些运算可以在堆栈上进行,这种情况线程是在用户态运行的,某些需要高权限运行的指令,或者某些优先级