动态内容缓存

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来管理静态化内容。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维小白

12.24 php-fpm进程管理

12.24 php-fpm进程管理 [root@hf-01 ~]# cat /usr/local/php-fpm/etc/php-fpm.d/www.conf ...

25410
来自专栏零基础使用Django2.0.1打造在线教育网站

利用Flask搭建微电影视频网站(四):后台页面搭建

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

6081
来自专栏Flutter&Dart

DartVM服务器开发(第八天)--http服务端框架

Aqueduct是一个HTTP Web服务器框架,用于构建用Dart编写的REST应用程序。

4734
来自专栏云计算教程系列

如何在CentOS 6.5上使用Unicorn和Nginx部署Rails应用程序

在部署基于Rails的Web应用程序时,简单设计的应用程序服务器可以在几分钟内启动并运行。但是,如果您希望更好地控制服务器设置或想要尝试更灵活的新功能,那么使用...

1492
来自专栏帅小子的日常

redis集群的搭建

3825
来自专栏幸山的专栏

精通yum配置以及问题解决

yum基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁...

1K0
来自专栏java思维导图

架构师详解:Nginx 架构

原文链接:https://my.oschina.net/u/3770281/blog/1802493

1572
来自专栏小狼的世界

主机名修改后导致计划任务失败

原来在一台Windows 2008服务器上配置了一个SVN UPDATE的计划任务,定期将版本库中的最新版本抓取到本地。在主机名更改后,计划任务执行失败,提示“...

1801
来自专栏西安-晁州

nodejs常用npm包

express常用npm包整理如下 art-template  一款js模板引擎,性能不错 jayson       一款纯node的rpc应用包,可实现rpc...

3030
来自专栏张善友的专栏

WS-Eventing、WS-Transfer Web服务标准

传输(Transfer)     WS-Transfer详细说明了对通过Web服务进行访问的数据实体进行管理所需的基本操作。要了解WS-Transfer需要介绍...

19410

扫码关注云+社区

领取腾讯云代金券