构建高性能web站点——缓存

构建高性能web站点——缓存

小楼一夜听春雨,深巷明朝卖杏花


提高站点的吞吐率,降低响应时间,缓存是其中一个有效的解决方案。以下根据《构建高性能web站点》总结以下各种所用到的缓存。

动态内容缓存

每次向服务器请求一个网页,服务器端都会经过一系列的计算,比如连接数据库、查询数据、生成网页等,然后返回一个网页,浏览器根据接收到内容渲染网页。按照缓存的动机,可以把计算好的结果进行缓存,并在后续有需要的时候直接取出来给用户。对于动态网页来说,缓存的内容就是动态输出的html内容,如果是一些其他数据,也可以缓存,原理和机制与缓存动态网页一样。

缓存的文件可以放到磁盘上。放在磁盘,会有磁盘IO的开销问题,不过相比于一些比较复杂的动态计算(如链接数据库,查询数据库),磁盘IO开销比较小的。如果要缓存的文件很多,同一个目录下会拥挤大量的文件。一旦同一个目录文件数量达到一定规模的时候,CPU花在遍历目录上的时间便非比寻常。当然可以考虑支持目录hash来加速遍历,但是如果站点已经提供服务呢,更换新的文件系统不大现实。这时候比较好的方式是可以采用目录分级来解决该问题。

当然由于磁盘IO还是不够快,可以把需要缓存的东西放到内存中,比如借用服务器的插件或者模块。也可以自己实现。缓存放到内存中,速度会大大提升。如果觉得占用了本机宝贵的内存资源,可以使用一个独立的缓存服务器,利用memcached,memcached同样使用内存空间来保存缓存数据,能减少服务站点内存的使用,同时不用把文件存入较慢的磁盘中。数据的传输采用TCP即可。

动态内容缓存,能够一定程度上减少重复计算,缩短请求响应时间提高吞吐率。但是需要检查过期,不然就失去了动态缓存的意义了。过期检查有两种,一种是缓存生成时间为a,b时间之后过期,那每次使用缓存的时候,都看一下当前时间是否在b时间之内;另一种是缓存在x时刻过期,每次使用缓存时,比较当前时间和x时刻的先后关系。

有效期取值是一个trade-off的问题,主要根据站点的特点来设计。比如动态数据经常变化,有效期可以设置得短一点,如果是一个Blog,阅读的人远远多于撰写的人,则可以设置得长一点。

前面所述内容到目前为止,动态程序是缓存的代理人,对于缓存有着控制权。请求首先被送到动态程序,动态程序决定是否使用缓存。这带来了性能上不足。如果直接访问缓存,速度会惊人的快,至于实验这里不表。把动态内容静态化,能够节省大量的开销。静态内容更新策略有两种:1.在数据更新时重新生成静态化内容;2.定时更新静态内容。如果整个页面不能静态化,可以考虑页面局部静态化。

脚本加速

很多站点都是用脚本语言开发的,典型的比如php。脚本语言都是需要解释器解释执行的。和编译执行不一样,解释执行每次运行代码的时候,都需要对代码进行词法分析、语法分析、语义分析等,然后生成中间代码,解释器执行该中间代码,编译执行是编译成二进制可执行文件,需要运行的时候,直接运行该二进制文件即可,不需要反复编译。解释语言的效率主要来自生成中间代码的时间。可以把中间代码缓存起来,避免重复编译,能有效降低脚本执行的时间开销。

浏览器缓存

浏览器缓存能够带来很多好处,减少不必要的数据传输,提升站点的吞吐率。浏览器缓存中,缓存内容存储在浏览器本地,而内容是由服务器生成的,浏览器和服务器之间通过HTTP的“协商缓存”机制完成沟通。

其实一般来说,浏览器都会缓存所访问的内容。在chrome中,输入chrome://cache就能看到缓存的请求,在Mac下,缓存文件存放在 /Users/xxx/Library/Caches/Google/Chrome/Default/Cache xxx是用户名 这个目录下。其他系统其他浏览器存储的位置不一样。

协商过程

缓存文件一定要有最后过期时间或者创建时间,否则浏览器无法使用。当浏览器接收到的HTTP响应头包含Last-Modified时,暗示浏览器请求内容最后修改时间。当浏览器下一次请求的时候,在HTTP请求头中会有一个字段If-Modified-Since,询问服务器,在这之后请求的内容是否有更新。如果请求的是静态文件,web服务器直接拿该静态文件最后修改时间和If-Modified-Since这个时间对比就好。如果是动态内容,这时候就交给动态程序判断,看浏览器缓存是否有效。
对于静态内容,假设请求的是test.htm,基本过程如下:

Created with Raphaël 2.1.0 浏览器 浏览器 服务器 服务器 嘿,小服,给我test.htm 服务器查找文件并响应请求 小浏,告诉你这个内容Last-Modified是xxx,响应代码是200 缓存了这个内容 小服,我又要test.htm,If-Modified-Since 是xxx,内容更新过吗? 服务器查看该文件的最后修改时间,和xxx对比,判断没变化 这一次接头暗号是304,Not Modified 发现内容没有修改,直接使用本地缓存

HTTP/1.1还支持另一种协商ETag,是基于文件内容的。ETag主要用来标识文件内容,可以看成内容摘要,若文件内容变化,ETag也会变化。HTTP/1.1没有规定ETag的计算方式,可以由服务器自己决定。典型的文件摘要可以采用md5算法。

消灭请求

HTTP中还有个字段,是expires,告诉浏览器该内容何时过期,在过期之前,浏览器都可以使用本地缓存。静态内容可以直接配置web服务器,而对于动态内容,需要动态程序自己处理。

几种刷新方式

ctrl+F5(Mac是Command+Shift+R)

强制刷新,网页以及所有组件都向web服务器直接请求,不使用缓存协商。

F5(Mac是Command + R)

普通刷新,允许添加必要的缓存协商,不允许直接使用本地缓存。即支持Last-Modified,不支持Expires

超链接跳转或输入URL回车

允许浏览器以最少的请求来获取数据。

web服务器缓存

第一部分动态内容缓存中,其主要思想是缓存动态输出的内容,减少重复的计算来节省时间。

在请求和响应过程中,如果只关注URL和最终的响应内容,它们就像一系列的对应关系。这种对应关系是可以缓存起来的。在很多情况下,一个URL在比较长的一段时间中都对应唯一一个响应内容,比如一个静态文件或者一个更新不太频繁的动态内容。一旦将内容缓存,下次web服务器就可以在收到请求可以立即拿出缓存好的响应内容给浏览器,这个动作在其他所有动作之前,能够节省部分时间。

这个任务Web服务器做最合适,主流的Web服务器都提供支持。缓存内容都是以文件形式存储的,可以选择放在内存或者磁盘,放在磁盘哪个目录下,这些都是可以通过配置来调整的。

对于静态内容,缓存很容易理解。缓存动态内容,也是把动态输出的内容缓存起来。下一次请求相同的url时,不需要再经过动态程序判断,web服务器直接返回缓存内容。这里带来一个问题,就是控制有效期的问题。web服务器对于缓存的过期检查是建立在HTTP/1.1协议上的对话。和浏览器缓存原理是一样的。对于一个动态内容是在HTTP响应头中追加Expires标记。如果没有Expires,可以使用另一个标记Last-Modified。web服务器会根据标记自动判断过期,这些都不需要动态程序来做。

当然,如果站点中有很多小的静态文件,服务器相当大的开销是在打开文件上,那么可以直接缓存文件描述符。这个比较狠。

反向代理缓存

现在很多站点都会使用反向代理服务器。反向代理服务器位于用户和web服务器之间。用户向服务器发出请求,请求首先到代理服务器上,代理服务器把请求转发到后端的web服务器,web服务器返回一个内容给代理服务器,代理服务器返回给用户浏览器。

Created with Raphaël 2.1.0 浏览器 浏览器 反向代理服务器 反向代理服务器 web服务器 web服务器 发出请求 请求后端web服务器 返回内容 返回给浏览器

引入反向代理服务器的目的有很多,比如增强安全性,因为它将真正的web服务器隐藏在后端,但是真正的目的是通过缓存加速和负载均衡。

通过以上的序列图,很容易理解缓存的过程。就像web服务器缓存和浏览器缓存一样,可以将内容缓存在反向代理服务器上。缓存机制的实现也是采用HTTP/1.1协议,至于细节在前面已经有介绍了,不赘述。

如果反向代理服务器的并发模型比较好,使用反向代理服务器会比直接使用web服务器缓存吞吐率更高。

对于使用反向代理服务器来达到负载均衡的目的,不属于这个主题,这里不详细阐述。

目录

本文目录:


参考自《构建高性能Web站点》-郭欣

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值