一次HTTP请求中有哪些地方可以缓存
2011-10-15 00:00
246 查看
一个HTTP Request从用户点击的一瞬间,到服务器返回请求,一般会经过以下类型的缓存(按照由客户端到服务器端的顺序)。
1. 浏览器端存储:
HTML5中的本地存储功能允许在浏览器端保存数据。
Flash等第三方插件也有类似的功能。
JavaScript保存一些数据在当前Context也算这种类型。
2. 浏览器端文件缓存:
HTTP协议中在时间未过期等情况下,不请求服务器数据而直接使用本地的文件(请参考HTTP协议中关于缓存控制的部分)。
常用于html JavaScript css等文件的缓存,以减少请求次数。
3. HTTP缓存304:
HTTP协议中,如果服务器文件未发生变化,不返回用户请求的数据,而只是返回一个304响应(更多内容请参考HTTP协议)。
不减少请求数量,但是减少了响应的体积。
通过控制动态文件的输出内容实现缓存(可以了解一下 Etag 等相关内容)。
4. 服务器端文件类型缓存
动态页面静态化为html文件。
CDN。
某些不常更新的的数据静态化为文件。
主要是为了节省服务器资源,例如CPU。
5. 普通内存缓存:
这是我们平时用的最多的缓存。
功能很强,例如.net中的Cache类按照时间等规则定时过期数据,例如缓存数据库数据。
6. 分布式缓存:
例如Memcached,现代应用程序的规模越来越大,难免用上此类方案。
经常通过自己分割程序实现分布式的缓存。
7. 数据库缓存
大部分数据库都会把数据加载到内存中以提高性能
8. 表现层&DOM缓存
在客户端和服务器端缓冲HTML片段,(只更新需要更新的部分,如很多ajax的实现)。
例如jQuery中的链式表达式 (某些数据说明链式表达式会快25%)。
以上涉及的部分都是可以通过开发或者配置实现控制的(有些不容易控制的缓存类型就没有提到)。此外:
许多编程语言中把数据放在静态变量等成员中,其实也是一种缓存。
除了对于数据和文件的缓存以外,还有很多对于程序本身的缓存。
关于HTTP Cache部分可以查看 RFC 2616。
许多组件自带缓存功能,例如NHibernate,如果注意其配置可以获得不错的性能提升。
按照常用程度从多到少,开发难度从容易到复杂,在开发中优先度从高到低,个人建议的顺序为 5 > 2 > 3 > 8 > 4。
服务器缓存直接在代码中开发,成本低,功能强。HTTP缓存一般由服务器(IIS,apache)等内置支持,当然也可以编程实现,也是很推荐的做法。本地存储还不够普及,在对客户端要求较高的网站中使用较多。MemCached之类的解决方案是对较大规模的网站必用的。数据库缓存是一个比较难以控制的范畴(相比来说优化索引和数据库设计更为有效)。
同时推荐几个Tool,Fiddler HttpWatch 用来跟踪http请求的细节,DotTrace 用来跟踪.net代码的细节,希望以上这些内容可以让各位在开发高性能web应用上有所收获。
1. 浏览器端存储:
HTML5中的本地存储功能允许在浏览器端保存数据。
Flash等第三方插件也有类似的功能。
JavaScript保存一些数据在当前Context也算这种类型。
2. 浏览器端文件缓存:
HTTP协议中在时间未过期等情况下,不请求服务器数据而直接使用本地的文件(请参考HTTP协议中关于缓存控制的部分)。
常用于html JavaScript css等文件的缓存,以减少请求次数。
3. HTTP缓存304:
HTTP协议中,如果服务器文件未发生变化,不返回用户请求的数据,而只是返回一个304响应(更多内容请参考HTTP协议)。
不减少请求数量,但是减少了响应的体积。
通过控制动态文件的输出内容实现缓存(可以了解一下 Etag 等相关内容)。
4. 服务器端文件类型缓存
动态页面静态化为html文件。
CDN。
某些不常更新的的数据静态化为文件。
主要是为了节省服务器资源,例如CPU。
5. 普通内存缓存:
这是我们平时用的最多的缓存。
功能很强,例如.net中的Cache类按照时间等规则定时过期数据,例如缓存数据库数据。
6. 分布式缓存:
例如Memcached,现代应用程序的规模越来越大,难免用上此类方案。
经常通过自己分割程序实现分布式的缓存。
7. 数据库缓存
大部分数据库都会把数据加载到内存中以提高性能
8. 表现层&DOM缓存
在客户端和服务器端缓冲HTML片段,(只更新需要更新的部分,如很多ajax的实现)。
例如jQuery中的链式表达式 (某些数据说明链式表达式会快25%)。
以上涉及的部分都是可以通过开发或者配置实现控制的(有些不容易控制的缓存类型就没有提到)。此外:
许多编程语言中把数据放在静态变量等成员中,其实也是一种缓存。
除了对于数据和文件的缓存以外,还有很多对于程序本身的缓存。
关于HTTP Cache部分可以查看 RFC 2616。
许多组件自带缓存功能,例如NHibernate,如果注意其配置可以获得不错的性能提升。
按照常用程度从多到少,开发难度从容易到复杂,在开发中优先度从高到低,个人建议的顺序为 5 > 2 > 3 > 8 > 4。
服务器缓存直接在代码中开发,成本低,功能强。HTTP缓存一般由服务器(IIS,apache)等内置支持,当然也可以编程实现,也是很推荐的做法。本地存储还不够普及,在对客户端要求较高的网站中使用较多。MemCached之类的解决方案是对较大规模的网站必用的。数据库缓存是一个比较难以控制的范畴(相比来说优化索引和数据库设计更为有效)。
同时推荐几个Tool,Fiddler HttpWatch 用来跟踪http请求的细节,DotTrace 用来跟踪.net代码的细节,希望以上这些内容可以让各位在开发高性能web应用上有所收获。
相关文章推荐
- 一次完整的HTTP请求与响应涉及了哪些知识?
- 一次HTTP请求中的缓存
- VR可以用做除游戏外的哪些地方
- 一次完整的HTTP请求与响应涉及了哪些知识?
- 一次完整的HTTP请求与响应涉及了哪些知识?
- 一次HTTP请求中的缓存
- 哪些地方可以嵌入JS
- TimesTen可以缓存哪些版本的Oracle数据库
- 关于缓存_一次动态请求经过哪些缓存ppt
- js脚本都可以放在哪些地方
- 一次完整的HTTP请求与响应涉及了哪些知识?
- 如果写了一篇文章有哪些地方可以发表的
- 一次HTTP请求中的缓存
- 一次完整的HTTP请求与响应涉及了哪些知识?
- 使用Sqlite时有哪些可以优化的地方
- 一个可以查看 Linux 当前缓存了哪些大文件的小工具
- 一次完整的HTTP请求与响应涉及了哪些知识?
- 分析客户哪些东西可以赚钱?
- 有哪些系统服务可以关掉?
- 一个http请求的响应报文即response,头部即header,可以任意增加属性吗,即自定义header?