Answers:
如果使用视图或db_query(),则缓存不会太慢。缓存的工作原理始终相同,当缓存未命中时如何获取数据完全取决于您。
要查看一些示例,您可以查看使用cache_get()的函数,例如variable_initialize()。
如果您的函数被多次调用,那么您可能希望将其与静态缓存结合使用,例如参见archiver_get_info()。而且,如果数据重建确实很慢,则可以像variable_initialize()一样使用锁定框架来防止它发生多次。
请注意,仅缓存一个缓慢的查询才有意义,因为cache_get()也是一个数据库查询,除非您使用像Memcache这样的备用缓存后端。
最后,Views已经内置了缓存,可以在您的视图中进行配置。因此,这也可能是一个选择。
db_query()
,而必须缓存from中的值,$results->fetchAll()
而不是缓存$results
使其真正起作用的关键。
我认为数据库层没有任何内置的缓存机制(尽管我可能错了),但是您可以使用默认的缓存API。
这只是一个基本示例,该示例将缓存查询结果以获取特定类型的节点:
function MYMODULE_get_nodes_by_type($type) {
// Setup a cache ID
$cid = 'MYMODULE:node_types:' . $type;
// If a cached entry exists, return it
if ($cached = cache_get($cid)) {
return $cached->data;
}
// Otherwise load the data
$data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();
// And cache it
cache_set($cid, $data, 'cache', strtotime('+6 days'));
}
除了Drupal提供的标准cache_set / cache_get机制之外,如果您使用MySQL作为数据库,则可以启用查询缓存,该缓存可以透明地缓存视图或任何其他数据库查询的结果。 mysqltuner可以帮助确定高速缓存大小的合适值。
只是请注意,如果您要对数据库进行大量写操作,则由于缓存无效策略的工作方式(写表会使所有SELECT FROM或JOIN该表的条目无效),查询缓存的效率会降低。
PostgreSQL也有一个缓存机制,但是我没有直接的经验。