db_query()の結果をキャッシュするにはどうすればよいですか?


9

私が使用しviews_get_view_result()、それはその時に便利だったので、ビューからの結果を得るために。クエリ結果はめったに変更されません。6日間ビューのキャッシュを使用できました。

db_query()キャッシュに変換するにはどうすればよいですか?

回答:


9

ビューまたはdb_query()を使用する場合、キャッシュの問題はありません。キャッシングは常に同じように機能し、キャッシュミスが発生したときにデータをフェッチする方法は完全にあなた次第です。

  1. キャッシュエントリを識別するためのキャッシュIDを作成します。単純なハードコードされた文字列、または引数などに基づいた複雑な文字列を使用できます。
  2. キャッシュからロードできるかどうかを確認します。
  3. そうでない場合は、データを再構築し、必要な有効期限でキャッシュに入れます。

いくつかの例を見るには、cache_get()を使用する関数、たとえばvariable_initialize()を見てください

関数が複数回呼び出される場合は、おそらくそれを静的キャッシュと組み合わせる必要があります。たとえば、archiver_get_info()を参照してください。また、データの再構築が非常に遅い場合は、variable_initialize()のようにロックフレームワークを使用して、データの再構築が複数回発生するのを防ぐことができます。

Memcacheなどの代替キャッシュバックエンドを使用しない限り、cache_get()もdbクエリであるため、単一のクエリのキャッシュは遅いクエリの場合にのみ意味があることに注意してください。

最後に、ビューにはキャッシュが組み込まれており、ビューで構成できます。だから、それもオプションかもしれません。


私に打ちのめす;)私は自分の答えをコード例として残しておきますが、これははるかに有用な情報です
クライヴ

PDOインスタンスはシリアライズ可能ではないと思いましたか?
mpdonadio

1
いいえ、そうではありませんが、それは関係ありません。pdo結果リソースはキャッシュせず、そのクエリから実際にフェッチしたデータ構造をキャッシュします。
Berdir 2012

私はそれが非常に関連していると思います。@MotoTribeはからの結果をキャッシュについて尋ねたdb_query()、との値をキャッシュする必要が$results->fetchAll()ないことは$results、実際に仕事にそれを得るための鍵です。
mpdonadio

7

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'));
}

3

データベースとしてMySQLを使用している場合、Drupalが提供する標準のcache_set / cache_getメカニズムに加えて、ビューの結果や他のデータベースクエリを透過的にキャッシュできるクエリキャッシュを有効にできますmysqltunerは、キャッシュサイズの適切な値を把握するのに役立ちます。

データベースへの大量の書き込みを行っている場合、キャッシュの無効化戦略が機能するため、クエリキャッシュの効果が低下することに注意してください(テーブルへの書き込みにより、そのテーブルからSELECT FROMまたはJOINするすべてのエントリが無効になります)。

PostgreSQLのキャッシングメカニズムもありますが、私はそれを直接使用したことがありません。


3

私は最近、キャッシュアクションモジュールを発見しました。このモジュールを使用すると、ビューのキャッシュをルールによってトリガーされるキャッシュに設定し、特定のビューおよびビューの表示でキャッシュを無効にするルールを作成できます。

たとえば、特定のコンテンツタイプのノードを一覧表示するビューのキャッシュは、そのコンテンツタイプの新しいノードが作成されるときに空にすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.