动态内容缓存

4.1 缓存与速度

    这里所说的动态内容缓存是自行实现的缓存机制,包括整页缓存、局部缓存、数据缓存等。

    缓存的目的是把花费昂贵开销的计算结果保存起来,以后需要的时候直接取出,避免重复的计算,一切缓存的本质都是如此。

    CPU缓存是位于CPU和内存之间的临时寄存器,它的容量不大,但交换速度高于内存,CPU把频繁交换的数据放在缓存中,以后需要的时候直接从缓存中读出,从而避免访问速度较慢的内存。

    缓冲(Buffer)的目的在于改善各部件速度不匹配的问题。例如:用户态空间的数据写入磁盘时,显然内存的速度要快于磁盘的速度,这时加入磁盘缓冲区,让数据源源不断地写入磁盘缓冲区,再由磁盘缓冲区再写入磁盘,这样内存就不用等磁盘而慢下来。视频缓冲就是这种类型。

    缓冲和缓存都需要一块存储区,本质都是与速度不一致有关,但缓存更注重的是策略,也就是说缓存命中率,凡是使用缓存都需要注意命中率问题。

4.2 页面缓存

    对动态网页来说,缓存的内容实际是动态网页输出的HTML,称为页面缓存。

    对于其它动态内容比如动态图片或动态XML数据,也是将它们的输出结果整体进行缓存,实现机制跟动态内容一样。

    可以将动态内容缓存存储在磁盘上,磁盘空间大、廉价,可以存储大量的缓存文件,这是种比较容易部署的方法。

    一个动态网页根据URL参数不同,会产生多种不同的结果,而每种结果都必须生成对应的缓存文件。如果缓存文件多的话,那么Cache目录下会拥挤大量的文件,这样CPU花费在遍历目录的时间就非同异常,如果写缓存比较频繁,那么CPU很容易100%,这时可以采用缓存目录分级来解决这个问题。可以将每个目录下的子目录或文件数量控制在有限的范围内,但同时会增加点目录切换的次数。

    动态内容的目的在于提供变化的内容,所以它的缓存不可以长期有效,否则就失去了动态内容的意义。所以动态内容的缓存机制必须能够判断缓存何时失效,何时重新生成新的缓存。

    为每个缓存标记一个过期时间,动态内容每次对缓存进行过期检查,这是种常见的缓存过期检查策略,当然方法有很多。

    动态内容在创建缓存文件时会留下两个时间标记,一个是缓存文件的创建时间,一个是缓存失效时间,它有两种过期检查方法:

    每次检查时,根据缓存创建的时间、缓存有效期长度及当前时间来判断是否过期。即当前时间离缓存创建时间的长度超过了缓存有效期的时间长度则认为它过期了,这是一种相对比较。

    每次检查时,根据缓存失效时间和当前时间来比较来判断是否过期,这是一种绝对比较。

    两者的区别在:应用第2种方法时,在缓存过期前,如果修改了缓存有效期长度,是不会影响上一次缓存的过期时间。而第1种方法,修改缓存有效期长度会影响每一次的过期检查。如果缓存有效期长度不变的话,那么两者是没啥区别的。

    缓存过期检查是存在一定开销的。

    不只是缓存文件的加载存在磁盘IO开销,脚本文件和页面模板也一样,不过有脚本加速器可以对脚本文件进行缓存和优化。

    在输出缓存之前,不要加载不必要的东西。

    为避免加载缓存文件时的磁盘IO和磁盘本身的负载,可以将缓存内容存放在本机内存中,这样加载缓存文件就没有磁盘IO的开销。

    还可以将HTML缓存存储在单独的缓存服务器上,利用memcached可以通过TCP将缓存存储到其它服务器中。而memcached就是利用内存空间来保存缓存数据,减少了不必要的磁盘IO,另一方面,memcached在存储区中维护着对每个key的过期检查,一旦过期,memcached将自动删除过期的key,这种过期检查很方便。不过放在缓存服务器上还是存在TCP Socket开销。

    将缓存保存在内存中虽然可以减少磁盘IO开销,但内存空间毕竟有限,这样会导致空间不够用时,使得缓存命中率降低,吞吐率也会相应地降低。这时就要想到如何扩展缓存空间,显然,利用memcached来实现分布式缓存扩展成为可能。

    缓存有效期的取值不能太长,虽然这样缓存命中率高了,但动态内容的更新却不能及时实现 。如果缓存有效期的取值太短,虽然动态内容的更新内容可以及时实现,但这样频繁创建缓存不如不使用缓存。

    缓存机制提供了一个有效的缓存控制途径,那就是可以在任何时候强制清除缓存,这在动态内容更新频率较低的时候适合使用。

4.3 局部无缓存

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

    要注意的是要评估局部动态数据的影响力,如果一个动态网页中占主要开销的数据计算置于无缓存状态,那么这时缓存就失去了意义,这时可以考虑使用其它的缓存方式或页面组织结构,比如用数据层缓存。

4.4 静态化内容

    实际情况中,吞吐率往往受限于Web服务器的出口带宽。

    静态化网页的性能要大大高于动态缓存的性能,静态网页在请求的时候不涉及内容计算,但不代表它不需要计算,它需要动态程序来创建和更新。

    一般使用CMS来管理静态内容,同时CMS可以在必要的时候更新静态化内容。

    静态内容更新策略有2种,一是在需要更新的时候重新生成静态内容,二是定时重新生成静态化内容。

    静态网页可以不必整页更新,可以使用SSI(服务器端包含)技术实现各个局部页面的独立更新,这节省了整页的计算开销和磁盘IO开销,甚至网络IO,但任何节省都存在一定的开销 。SSI技术可以在任何一款主流的Web服务器中找到相应的模块。一旦网页支持SSI,那么每次请求的时候服务器必须通读网页内容,查找include标签,这需要大量的CPU开销。

    请求的文件越大,花在传输上的时间就越多,单位时间的数据传输量也越大,同时花在处理Socket和打开文件等时间比例就越小。

    使用SSI在管理静态内容时可以重用页面,可提高可维护性。在站点负载不大或带宽有限制的情况下,完全可以使用必要的include来管理静态化内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值