更新頻度が低く、かつ、参照頻度の高いマスタデータとかは、毎回DBからとってくるのはパフォーマンス的にもったいないコストになりがち。
とはいえ、定数クラスっぽいところに書いておくのも、データの一元管理という意味でもよくはないだろうし、なんかデータをロジックに混ぜちゃっているみたいで気持ち悪かったりする。
とはいえ、定数クラスっぽいところに書いておくのも、データの一元管理という意味でもよくはないだろうし、なんかデータをロジックに混ぜちゃっているみたいで気持ち悪かったりする。
ということで、これは定数として扱いつつも、データはDBにマスタがあるようにして、DB接続コストもかからないようにするにはキャッシュだよねー、ということになった。
題材としては適切じゃないんだけど、都道府県マスタのイメージで。
Before
<?php
class Const {
public static function getPrefectureArray(){
return array(
'1'=>'北海道', '2'=>'青森県', '3'=>'岩手県', '4'=>'宮城県', '5'=>'秋田県',
'6'=>'山形県', '7'=>'福島県', '8'=>'茨城県', '9'=>'栃木県', '10'=>'群馬県',
'11'=>'埼玉県', '12'=>'千葉県', '13'=>'東京都', '14'=>'神奈川県', '15'=>'新潟県',
'16'=>'富山県', '17'=>'石川県', '18'=>'福井県', '19'=>'山梨県', '20'=>'長野県',
'21'=>'岐阜県', '22'=>'静岡県', '23'=>'愛知県', '24'=>'三重県', '25'=>'滋賀県',
'26'=>'京都府', '27'=>'大阪府', '28'=>'兵庫県', '29'=>'奈良県', '30'=>'和歌山県',
'31'=>'鳥取県', '32'=>'島根県', '33'=>'岡山県', '34'=>'広島県', '35'=>'山口県',
'36'=>'徳島県', '37'=>'香川県', '38'=>'愛媛県', '39'=>'高知県', '40'=>'福岡県',
'41'=>'佐賀県', '42'=>'長崎県', '43'=>'熊本県', '44'=>'大分県', '45'=>'宮崎県',
'46'=>'鹿児島県', '47'=>'沖縄県'
);
}
After
<?php
class Const {
public static function getPrefectureArray(){
$frontendOptions = array(
'lifetime' => 15, // キャッシュの有効期限を(秒)
'automatic_serialization' => true
);
$backendOptions = array(
'cache_dir' => 'C:/Dev/php/tmp/' // キャッシュファイルを書き込むディレクトリ
);
$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
if(!$result = $cache->load('cache_db_pref_array')) {
// キャッシュが見つかりませんでした。データベースに接続します
require_once dirname(__FILE__).'/../db/table/Prefecture.php';
Hmr_Db_Connector::getConnection();
$pref = new Prefecture();
$result = $pref->fetchAll()->toArray();
$cache->save($result, 'cache_db_pref_array');
}else{
echo "キャッシュが見つかりました!";
}
return $result;
}
}
僕は都道府県のはべた書きしてるので、これじゃないんだけど、仕事で使っているデータのマスタ(30行くらいのマスタデータ)で同じことをやったらローカル開発環境、かつ、バックエンドがファイルでも早くなったのが体感できた。気がする。これがバックエンドがmemcachedで、むちゃくちゃ参照がある状況だったら失禁してしまうくらいパフォーマンスが上がるんだと思う。
ちなみに設定まわりはZend_Config_Iniとかと組み合わせるといいかも。ついでにconfigの内容もキャッシュしちゃえって気がしてきた。
なんかいいよね。キャッシュって。なんでもかんでもキャッシュしたくなるけど、ターゲットとなるデータボリュームと更新頻度と参照頻度を加味して使わないと罰があたるかもしれない。そして、かならず効果測定を行いましょう。
コメントする