回答:
ビューまたはdb_query()を使用する場合、キャッシュの問題はありません。キャッシングは常に同じように機能し、キャッシュミスが発生したときにデータをフェッチする方法は完全にあなた次第です。
いくつかの例を見るには、cache_get()を使用する関数、たとえばvariable_initialize()を見てください。
関数が複数回呼び出される場合は、おそらくそれを静的キャッシュと組み合わせる必要があります。たとえば、archiver_get_info()を参照してください。また、データの再構築が非常に遅い場合は、variable_initialize()のようにロックフレームワークを使用して、データの再構築が複数回発生するのを防ぐことができます。
Memcacheなどの代替キャッシュバックエンドを使用しない限り、cache_get()もdbクエリであるため、単一のクエリのキャッシュは遅いクエリの場合にのみ意味があることに注意してください。
最後に、ビューにはキャッシュが組み込まれており、ビューで構成できます。だから、それもオプションかもしれません。
db_query()
、との値をキャッシュする必要が$results->fetchAll()
ないことは$results
、実際に仕事にそれを得るための鍵です。
DBレイヤーにはキャッシュメカニズムが組み込まれているとは思いませんが(私は間違っているかもしれません)、デフォルトのキャッシュ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'));
}
データベースとしてMySQLを使用している場合、Drupalが提供する標準のcache_set / cache_getメカニズムに加えて、ビューの結果や他のデータベースクエリを透過的にキャッシュできるクエリキャッシュを有効にできます。 mysqltunerは、キャッシュサイズの適切な値を把握するのに役立ちます。
データベースへの大量の書き込みを行っている場合、キャッシュの無効化戦略が機能するため、クエリキャッシュの効果が低下することに注意してください(テーブルへの書き込みにより、そのテーブルからSELECT FROMまたはJOINするすべてのエントリが無効になります)。
PostgreSQLのキャッシングメカニズムもありますが、私はそれを直接使用したことがありません。
私は最近、キャッシュアクションモジュールを発見しました。このモジュールを使用すると、ビューのキャッシュをルールによってトリガーされるキャッシュに設定し、特定のビューおよびビューの表示でキャッシュを無効にするルールを作成できます。
たとえば、特定のコンテンツタイプのノードを一覧表示するビューのキャッシュは、そのコンテンツタイプの新しいノードが作成されるときに空にすることができます。