モデルキャッシュの検証

前述の通り、表示が劇的に速くなるビューキャッシュですが、若干問題点があります。


特に、閲覧者権限によって、1つの画面に表示/非表示させる部分が複数存在する場合。
前述の通り、cake:nocache でキャッシュせず毎回判断する方法もありますが、数が多いとその負荷も無視できなくなってきます。


モデルキャッシュの方法も検討してみました。



モデルキャッシュの導入方法は、以下に倣いました。
http://www.exgear.jp/blog/2008/11/cakephp12-behavior%E3%81%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E8%A1%8C%E3%81%86/
blog.katsuma.tv


CacheBehavoirを追加して、app_model.phpにキャッシュ対応のfind()を作成。
すると、app/tmp/cache以下に、下のようなキャッシュファイルが作成されるようになります。

[cake@cake chara-shee]$ ls app/tmp/cache/
cake_character_cache_method_list
cake_character_find_604800_66667e5a4a6c16509a5a9cc55f2315d5


キャッシュ前後でコントローラの実施速度を比較すると、約半分の時間で済むようになっていました。

キャッシュなし
2010-07-14 19:53:12 Debug: [0a0c8bca] 0.00001 : <==construct :
2010-07-14 19:53:12 Debug: [0a0c8bca] 0.17375 : characters/view: beforeFilterStart :
2010-07-14 19:53:12 Debug: [0a0c8bca] 0.44234 : characters/view: beforeRenderStart :
2010-07-14 19:53:13 Debug: [0a0c8bca] 1.07218 : characters/view: afterFilterStart :
2010-07-14 19:53:13 Debug: [0a0c8bca] 1.09742 : <==destruct :
キャッシュあり
2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.00001 : <==construct :
2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.06867 : characters/view: beforeFilterStart :
2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.19387 : characters/view: beforeRenderStart :
2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.56219 : characters/view: afterFilterStart :
2010-07-14 19:53:19 Debug: [0ef6f3e4] 0.57164 : <==destruct :


しかし、ApacheBenchmarkで測定すると、アクション出力速度は約1.5回/秒・・・ビューキャッシュほどの効果は得られていません。


メインはビューキャッシュで、状況に応じてモデルキャッシュを組み合わせるのがよさそうです。

モデルキャッシュ導入差分

app/models/app_model.php

@@ -8,6 +8,7 @@ class AppModel extends Model {
        var $actsAs = array(
                'Containable',
+               'Cache',
        );

@@ -376,5 +377,18 @@ class AppModel extends Model {

+       function find($type = null, $queryData = array())
+       {
+               $args = array($type, $queryData);

+               if ($this->Behaviors->attached('Cache')) {
+                       if ($this->cacheEnabled()) {
+                               return $this->cacheMethod(Configure::read('Cache.expir
+                       }
+               }
+
+               return parent::find($type, $queryData);
+       }
 }

CacheBehavoirは、参考URLに同じ