[翻译]写给web开发者和web管理员的缓存教程

简介:

原文地址:

Caching Tutorial for Web Authors and Webmasters

1 什么是web缓存?人们为什么使用它们?

2 web缓存的类型

  2.1 浏览器缓存

  2.2 代理缓存

  2.3 网关缓存

4 web缓存如何工作

6 构建一个有缓存意识的站点用到的技巧

7 写有缓存意识的脚本

 

1 什么是web缓存?人们为什么使用它们?

web缓存位于一个或者多个服务器和一个或者多个客户端之间,监视其中的请求,节约响应的数量。例如:页面,图片和文件。如果对相同的url地址的另外一个请求,可以使用已有的响应,而不是向原始服务器重新请求。

使用web缓存有两个主要原因:

1、减小延迟。因为请求从缓存,这个离客户端更近的地方,得到响应,而不是从原始服务器。花费更少的时间获取内容并且呈现出来,使得web看起来响应更快。

2、减少网络传输。因为响应被重用,减少了客户端的带宽使用。如果带宽需要付费的话,还可以节省开支,保持对带宽的较小需求。

2 web缓存的类型

2.1 浏览器缓存

如果你打开现代浏览器的设置对话框,都会发现一个缓存项设置。允许你使用硬盘来存储缓存的内容。缓存都有相似的工作原理。它会检查内容是否新鲜,每次会话都会检查,也就是浏览器的一次调用。

这种缓存在你浏览已经浏览过的页面的时候非常有用,如果你查看同一张图片,浏览器会缓存起来,瞬间就可以显示出来。

2.2 代理缓存

代理缓存以相似的方式工作,但是规模更大。代理以相同的方式服务于成百上千的用户,大公司或者ISP通常在防火墙上面设置他们,或者是单独的设备。

因为代理缓存不是客户端或者原始服务器的一部分,他们位于网络的某个地方,请求会经过他们。使用他们的一个办法是设置你的浏览器代理,告诉浏览器使用那些代理。另外一个方法是拦截代理。拦截代理是通过网络底层是实现的,客户端不需要设置,甚至不需要知道他们的存在。

代理缓存是一种共享的缓存,同时不止有一个用户使用,同时有很多用户使用,使得他更擅长于减小延迟和减少带宽。因为常用的内容会被多次的使用。

2.3 网关缓存

和“反向代理缓存”一样,网关缓存也位于客户端和服务器的中间,他不是ISP部署用来减少带宽的,而是web站点管理员部署,使得站点更容易扩展,更可靠,拥有更好的性能。

有很多种方法可以将请求定位到网关缓存,典型的是用负载均衡,在客户端看来好像访问了原始服务器。

CDN(Content Delivery Network)也可以用来提供网关缓存功能。

 

教程主要讲述浏览器缓存和代理缓存,部分内容对于那些对网关缓存感兴趣的人也有用。

 

4 web缓存如何工作

所有的缓存都有一些列规则,用来决定在缓存有效的情况下,什么时候为表现层服务。一部分规则在协议(http1.0 http1.1)中设置,一部分由管理员设置。

通常来讲,包含下面的一些规则:

1、如果响应的头部信息中包含不需要缓存的设置,那就不需要缓存。

2、如果请求是验证方面的,或者是安全连接(https),不会被缓存。

3、在下列情况下,代表缓存中的一个内容是新鲜的(代表它可以在不访问原始服务器的情况下发送给客户端)

   3.1 包含expires设置,或者是age-controlling设置,并且还在保鲜期内。

   3.2 如果缓存的内容刚被表现层使用,而且它还没有被修改过。

新鲜的内容直接从缓存或者,不用去原始服务器获取。

4、如果表现层过期,将会访问原始服务器并且验证它,或者告诉缓存是否缓存的拷贝可用。

5、在下列情况,例如,从网络断开连接,缓存会提供旧的响应内容,而不会访问原始服务器。

如果响应中没有ETag or Last-Modified这些信息,也没有任何关于新鲜的明显信息,通常,不总是,将被认为不使用缓存。

新鲜度和验证的信息对于缓存的工作来说都是很重要内容,新鲜度的信息直接从缓存中获取,验证的信息保证在没有被修改的情况下,避免发送完整的内容。

 

6 构建一个有缓存意识的站点用到的技巧

除了刷新信息和验证,下面的技巧可以使你的站点更加缓存友好。

1、使用一致的url地址。这是一条关于缓存的黄金法则。如果你在不同的页面,对不同的用户,或者是不同的站点,提供相同的内容,应该使用相同的url地址。这是最容易,也是最有效的,使你的站点缓存友好的方式。例如:如果你使用“/index.html”在某个地方,那么请一直使用这个地址。

2、在不同的地方使用公用的图片库,及公用的元素。

3、对于缓存中不经常改变的图片和页面,使用Cache-Control: max-age,并且设计一个较大的值。

4、对于缓存中有规律的改变的内容,给max-age或者是expire设置适当的值。

5、如果一个资源(尤其是需要下载的文件)的内容发生了变化,可以重新命名这个资源。那样的话,你可以设置一个将来的过期时间,还可以确保提供了正确的版本。

6、不要改变那些没有变化的文件。如果你这么做,所有的文件都会有一个新Last-Modified日期,会导致缓存失效。例如:当你更新站点的时候,不要拷贝覆盖整个站点,只是替换那些变化了的文件就可以了。

7、尽量少用ssl,因为加密的页面不会缓存,只在你需要的时候使用,而且在ssl页面中少用图片。

8、使用REDbot检查你的网页,它可以帮助你应用这篇教程中的很多概念。

 

7 写有缓存意识的脚本

默认情况下,很多脚本不会返回验证(响应头中的Last-Modified or ETag),或者是刷新信息(Expires or Cache-Control)。同时很多脚本是动态的,就是说每次请求会返回不同的响应,

通常来说,如果一个脚本的产出,对于一段时间之后的相同请求,是可以重用的,它就应该可以缓存。如果脚本改变的内容依赖于url,它是可以缓存的;如果产出依赖于cookie,验证信息,或者是其他外部条件,那么就不要缓存它。

1、使得一个脚本缓存友好(性能更优)的最好办法是,当脚本变化的时候,把脚本的内容输出到一个普通文件。这样web服务就可以像对待其他web page一样对待它,使得你的工作更轻松。记住,只在脚本发生变化的时候,才写文件,这样Last-Modified中的时间才会保留下来。

2、另一个缓存脚本为有限的新鲜的办法是,设置age相关的header。尽管可以通过expires来做,不过最容易的办法还是用Cache-Control: max-age,这样可以使得在请求之后的一段时间保存新鲜。

3、如果你没有按照上面的方法做,你需要在脚本上生成一个验证,用来响应带有If-Modified-Since or If-None-Match的请求。可以通过解析http header来实现,如果没有修改,返回304 Not Modified响应。

4、不随便使用POST,对于post的响应不会被缓存;如果你使用get,缓存才会存储将来用到的信息。

5、不要在url中嵌入特殊的用户信息,除非嵌入的信息对用户来说是唯一的。

6、在响应头中生成Content-Length。这很容易做到,它允许在长连接中使用脚本的响应。允许客户端在一次tcp/ip连接中做多次响应,而不是每次请求都建立一个连接。使得你的站点访问更快。




本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/972057,如需转载请自行联系原作者

目录
相关文章
|
28天前
|
开发框架 前端开发 JavaScript
ASP.NET Web Pages - 教程
ASP.NET Web Pages 是一种用于创建动态网页的开发模式,采用HTML、CSS、JavaScript 和服务器脚本。本教程聚焦于Web Pages,介绍如何使用Razor语法结合服务器端代码与前端技术,以及利用WebMatrix工具进行开发。适合初学者入门ASP.NET。
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
网络安全 开发工具 数据安全/隐私保护
|
1月前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
2月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
130 1
springboot的缓存和redis缓存,入门级别教程
|
2月前
|
存储 安全 API
12种最基本Web API:开发者的必学清单⭐
这些Web API 为创建高度互动和用户友好的网页应用开辟了无限可能。从存储和支付到地理位置和图形,掌握这些 API 可以提升您的Web开发技能。
141 2
|
3月前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
120 6
|
3月前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
在数字化时代,Web API成为连接前后端及构建复杂应用的关键。RESTful API因简洁直观而广受欢迎。本文通过实战案例,介绍Python Web开发中的RESTful API设计哲学与技巧,包括使用Flask框架构建一个图书管理系统的API,涵盖资源定义、请求响应设计及实现示例。通过准确使用HTTP状态码、版本控制、错误处理及文档化等技巧,帮助你深入理解RESTful API的设计与实现。希望本文能助力你的API设计之旅。
73 3
|
3月前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
105 3
|
2月前
|
存储 缓存 NoSQL
构建高性能Web应用:缓存的重要性及其实现
构建高性能Web应用:缓存的重要性及其实现