《构建高性能Web站点》第四章 动态内容缓存

Web站点更多的是提供动态内容,比如动态网页、动态图片、Web服务等,它们通常在Web服务器端进行计算,生成HTML,并返回给用户。与此同时,它们在生成HTML的过程中,不可避免涉及了更多的CPU计算和I/O操作,这已经超出了Web服务器本身,比如访问数据库涉及数据库服务器的CPU计算和磁盘I/O操作,以及与数据库服务器通信的网络I/O操作,同样的情况也发生在调用Web API,比如通过twitter API获取资料。而且通常这些操作都不是异步的,我们必须等待。

1.重复的开销

对于数据库中重复计算的I/O操作造成的重复的开销,我们可以通过缓存解决。

2.缓存与速度

说到缓存,事实上它将一直贯穿随后几章的内容,而在这里,我们所指的是由动态内容自行实现的缓存机制,这其中包括整页缓存、局部缓存、数据缓存等,除此之外,还有代码解释器缓存、Web服务器缓存等。

缓存(cache)的思想由来已久,简单地说,缓存的目的就是把需要花费昂贵开销的计算结果保存起来,在以后需要的时候直接取出,而避免重复计算,一切缓存的本质都是如此。

例如,我们都知道CPU缓存,它是位于CPU和内存之间的临时存储器,它的容量不大,但是交换速度要高于内存,CPU将频繁交换的数据放在缓存中,如果以后需要则直接读取缓存,从而避免访问速度较慢的内存,不可否认,尽管我们认为内存速度已经很快,但是在CPU缓存面前,它还是力不从心。

缓冲(buffer),在计算机应用场景中,我们使用它的引申含义,其目的在于改善各部件之间由于速度不同而引发的问题。比如将用户态地址空间的数据写入磁盘时,显然内存的速度比磁盘速度要快得多,所以人们设计了磁盘缓冲区,让数据源源不断地流进缓冲区,再由缓冲区负责写入磁盘,这样内存便可以不必随着磁盘的慢节奏来工作,所以磁盘缓冲区起到了将快速设备和慢速设备平滑衔接的作用,另外我们在线观看视频的时候,视频缓冲区的意义也是如此。

凡是使用缓存,都一定要意识到命中率的重要性。

3.页面缓存

对于动态网页来说,缓存的内容实际上就是动态网页输出的HTML,我们称为页面缓存(Page Cache),而对于其他动态内容,比如动态图片或动态XML数据,我们也可以将它们的输出结果整体进行缓存,其实现机制和动态网页是一样的。

通常,我们将动态内容的缓存存储在磁盘上,通常磁盘有足够而且廉价的空间来存储大量的文件,我们不用担心因为空间的限制而淘汰缓存,这是一种比较简单也容易部署的方法。

到目前为止,我们给动态内容引入了缓存,它在一定程度上避免了动态内容不必要的重复计算,缩短了请求响应时间并提高了服务器吞吐率。但是,动态内容的目的在于提供变化的内容,所以它的缓存不可能长期有效,否则就失去了动态内容的意义,所以动态内容的缓存机制必须能够判断缓存何时过期,以及何时需要生成新的缓存。
为每个缓存标记过期时间,然后动态内容每次对缓存进行过期检查,这是一种常见的缓存过期检查策略,实现方法很多。

前面的两种缓存实现都将缓存数据存储在磁盘文件中,每次缓存加载和过期检查都存在磁盘I/O的开销,反过来它也受到磁盘负载的影响,如果这个磁盘同时还运行着如数据库这样的磁盘I/O密集型应用,那么缓存文件的I/O操作便会存在一定的延迟。我们还可以将动态网页的HTML缓存在其他地方,比如本机内存中。

缓存服务器:

除此之外,我们还可以将HTML缓存存储在一台独立的缓存服务器中,利用memcached,我们可以很容易地通过TCP将缓存存储在其他服务器中,而且memcached同样也是使用内存空间来保存缓存数据,减少了不必要的磁盘I/O。另一方面,memcached在存储区中对于每一个key都维护一个过期时间,一旦达到这个过期时间,memcached便会自动删除这个key,这使得我们的过期检查非常容易,只需要在保存缓存数据时指定过期时间即可。

前文中多次提到缓存有效期,事实上对于它的取值并不是一件容易的事情。有效期如果太长,虽然缓存命中率提高了,但是动态网页的内容更新总是不能及时展现;而有效期如果太短,动态网页的内容虽能实时变化,但是频繁地创建缓存比没有缓存也好不到哪儿去。

幸运的是,除了不断调整缓存有效期之外,缓存机制还提供了一个有效的缓存控制途径,那就是可以在任何时候强行清除缓存,这在动态内容更新频率较低的时候适合使用,比如通常在一个Blog中,阅读的人总是远远多于撰写内容的人,这样就可以将缓存有效期设置得相对长一些,而每次内容更新时都主动清除缓存,促使动态内容创建新的缓存。

4.局部无缓存

在流行的模板框架中,在整页缓存的基础上,都提供了局部无缓存的支持,它允许在页面中指定一块包含动态数据的HTML代码段,每次这些动态数据都需要实时计算,然后和其余部分的缓存合成为最终的网页。

5.静态化内容

前面我们尝试的几种动态内容缓存方法中,动态程序看起来就像是缓存的代理人,每次用户的请求都要首先被送到动态程序,然后动态程序根据缓存有效期来决定是否输出缓存。这种方法使得动态内容对于缓存数据有着较强的控制权,但是这种控制权的代价是比较昂贵的,它带来了性能上的不足。

我们一般会使用CMS(内容管理系统)来管理静态化内容,同时CMS也可以在必要的时候帮助我们更新静态化内容。

对于静态化内容的更新策略,一般有以下两种:
● 在数据更新时重新生成静态化内容。
● 定时重新生成静态化内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值