テンプレートモジュールのキャッシュとその効果

現在開発中のMovable Type 4.15では、主にパフォーマンスの向上がはかられています。
中でも、「テンプレートモジュールのキャッシュ」は、うまく活用することで、再構築の所要時間を大きく短縮することができます。

1.テンプレートモジュールのキャッシュの概要

Movable Type 4以降では、テンプレートのモジュール化が進められています。
さらに、Movable Type 4.1では、サイドバーをウィジェットで管理するようになっています。

これらのテンプレートモジュールやウィジェットの中には、多くのページで出力内容が同じになるものがあります。
例えば、「カテゴリーアーカイブ」のウィジェットは、ブログの全ページに同じ内容が出力されます。

テンプレートモジュールやウィジェットは、ページごとに再構築されます。
しかし、各ページに同じ内容が出力されるのであれば、一度だけ再構築して、それ以後は再構築済みのものを使いまわす方が効率的です。
また、そのようにすれば、再構築の所要時間を短縮することができます。

「テンプレートモジュールのキャッシュ」は、このようなことを行う機能です。
一度再構築したテンプレートモジュールやウィジェットをファイルにキャッシュし、同じものを再構築する際には、キャッシュしたものをファイルから読み込みます。

2.テンプレートモジュールのキャッシュの利用方法

テンプレートモジュールのキャッシュを使うには、以下の手順を取ります。

2-1.キャッシュの機能をオンにする

まず、ブログ全体でキャッシュの機能をオンにします。

「設定」→「公開」メニューを選び、公開の設定のページを開きます。
そのページの「モジュールオプション」の箇所で、「テンプレートモジュールをキャッシュする」のチェックをオンにします。

↓ブログ全体でキャッシュをオンにする
cache1.png

2-2.テンプレートごとのキャッシュ方法の設定

次に、キャッシュしたいテンプレートモジュールやウィジェットで、キャッシュする方法を指定します。

キャッシュするテンプレートモジュール/ウィジェットを編集する状態にし、「テンプレートの設定」の部分を開くと、「モジュールのキャッシュ」の部分で、キャッシュ方法を設定することができます。
「キャッシュを消すタイミング」をオンにした場合、一度再構築したテンプレートモジュール/ウィジェットを、一定時間キャッシュする動作になります。
また、「作成または更新後に無効にする」をオンにした場合、ブログ記事等を作成または更新するまで、キャッシュが有効になります。

例えば、「カテゴリアーカイブ」のウィジェットをキャッシュするとします。
このウィジェットは、カテゴリーを追加/編集するか、あるいはブログ記事を追加/削除すると、出力内容が変化します。
そこで、「作成または更新後に無効にする」をオンにして、「ブログ記事」と「カテゴリ」のチェックをオンにします。

↓「カテゴリアーカイブ」ウィジェットのキャッシュ方法の設定
cache2.png

3.キャッシュの効果

テンプレートモジュールのキャッシュを行うと、どの程度再構築が速くなるか、測定してみました。
MTOS4.15βの最新リビジョンを新規インストールした環境に、当ブログ全体(記事1,311件/コメント2,585件/トラックバック1,267件/カテゴリー47件)をインポートして、以下の3通りのキャッシュを設定して、ブログ全体の再構築の所要時間を測定しました。

  • 方法A.キャッシュなし
  • 方法B.「カテゴリアーカイブ」ウィジェットをキャッシュ
  • 方法C.「カテゴリアーカイブ」と「月別アーカイブ」ウィジェットをキャッシュ

すると、以下のような結果が得られました。

方法再構築の所要時間
方法A
15分47秒
方法B
6分26秒
方法C
4分46秒

このように、「カテゴリアーカイブ」と「月別アーカイブ」ウィジェットをキャッシュするだけで、キャッシュしない場合の3分の1弱まで、再構築の所要時間を短縮することができました。
特に、「カテゴリーアーカイブ」ウィジェットをキャッシュしたことによる効果が大きいです。
「カテゴリアーカイブ」「月別アーカイブ」とも、ブログ記事数を集計する処理があり、データベースアクセスが大量に発生するために、再構築に時間を要しているものと思われます。

このように、テンプレートモジュールのキャッシュは、再構築の所要時間の短縮に大きな効果を発揮します。
特に、データベースに多くアクセスするテンプレートモジュール/ウィジェットほど、キャッシュの効果が大きいです。
Movable Type 4.15がリリースされたら、ぜひ利用すべき機能だといえます。

4.キャッシュの注意点

テンプレートモジュールやウィジェットによっては、組み込み先のテンプレートによって、出力内容が変化するものがあります。
そのようなものをキャッシュする場合は、方法を工夫する必要があります。
この点については、後日解説したいと思います。