跳转到主要内容
Dan 提交于 13 July 2012

缓存是指临时存储一些处理过的数据。它可以是结构化数据或是包含HTML格式化文本的字符串。用缓存数据来提供服务,比从多个数据表中读取和处理数据更快,但另一方面,缓存数据是不可编辑的,所以不可能把它处理成另外一种格式。因此,原始数据必须保留在数据库中。现在你有了多个数据副本,原始数据和缓存之间就有可能会失去同步。在这种情况下,缓存数据是“陈旧的”。有时这样没问题;如果你一天出产几篇文章,更新的内容在原本发布日期后的几分钟内不被匿名用户看到可能并没有多大关系。这是规模化方面的另外重要一课:理论服从实践。规模化永远是在寻求折衷方案,对于一个给定的网站,这只是哪种折衷更能接受的问题而已。

提示:注意用语“对于一个给定的网站”。没有放之四海而皆准的良方妙药,规模化永远都是因网站而异的,虽然有些实践经验适用于很多类似的网站。

Drupal可以利用缓存来存储整个页面,即页面的HTML,以供匿名用户访问。到admin/config/development/performance页面启用这个功能很简单,而且在最简单的共享主机上也能工作。注意该功能仅对匿名用户起作用,但常见的是,网站的大部分流量都来自匿名用户。默认情况下,提交新的内容会删除这部分缓存,但是可以设置一个最小缓存生命周期。还是那句话,因站而异。

提示:在共享主机上还有一个快于内建页面缓存的可选方案,Boost模块(drupal.org/project/boost)。该模块可以为你的匿名访客提供页面服务,完全绕过PHP。

让我们来看看开发者可以如何利用缓存来存储一个慢查询。假设你有一个非常慢的函数叫作very_slow_find(),下面就是如何利用缓存:

<?php $cache = cache_get('very_slow'); if ($cache) { $very_slow_result = $cache->data; } else { // Run the very slow query. $very_slow_result = very_slow_find(); cache_set('very_slow', $very_slow_result); } ?>

首先,你试图读取缓存。如果成功,就使用缓存中的数据;如果缓存不存在,你就运行你的查询并把结果存储在缓存中。采用这种方法,那个极慢的查询很少有必要发生,不过需要注意前面提到的陈旧缓存。在该例中,very_slow是缓存ID(cid)或者叫缓存键,$very_slow_result是你所存储的数据。

缓存被广为使用,并且被存储于各种不同的箱子中。把所有数据都存储在一起固然可行,但是把它们分开存储在一种Drupal称作“箱子”的东西中有两个好处:一个箱子中的内容可以与其他箱子中的内容分开来,在必要时废弃以避免陈旧数据;并且,每个箱子可以设置不同的机制来存储数据。(我将在本章稍后讲解一些可用的存储机制示例)在使用Drupal的缓存API提供的cache_getcache_set以及其他函数的时候,你不用担心哪个存储机制可用。这就是为何可插拔的子系统如此重要:你可以选择不同的存储机制而无需修改任何代码。

Drupal默认使用数据库来存储缓存数据——不是因为这是最佳方案,而是因为Drupal知道它们在那里。所幸还有替代方案。下面首先你将看到一个更多关于辅助开发的例子,它还展示了如何配置可插拔子系统;然后你将看到一些性能和规模化的解决方案。