[perlメモ]Cache::FileCacheを利用したキャッシュでキャッシュの作成日時と期限日時の情報を取得したい。

WEB APIを利用する場合などRESTで情報を受け取った場合、それをキャッシュしてWEB APIのサーバーに何度も同じリクエストを送らないようにします。理由はWEB APIのサーバーへの負荷を軽減する為なのと、何より毎回サーバーに問い合わせるよりキャッシュされたデータを参照する方が高速だからです。自前のキャッシュ処理を書いたりすると色々と融通がききますが、最近はお手軽にCache::FileCacheモジュールを利用したりもします。

◇関連:Browse and search CPAN : Cache::FileCache

その場合、キャッシュはリアルタイムに取得したデータではないので、リアルタイムな情報とは差異が出る場合があります。1時間位のキャッシュならまだしも数日、数週間、数カ月とキャッシュする場合もあるかと思います。また、キャッシュも1時間位のキャッシュだと結局は期限切れで毎回APIのサーバーに問い合わせる事になったりして効率も悪かったりします。それで長期間のキャッシュの場合は、キャッシュした日時を更新日時として表示したりします。(WEB APIの規約で表示を義務づけていたりする場合もあります。)

それで、Cache::FileCacheモジュールでキャッシュした情報を取得した場合にキャッシュを作成した日時の情報がほしかったりしますが、Cache::FileCacheのドキュメント自体には機能としてキャッシュの日時を取得する方法が載ってないようだし、ちょっと検索してみたい感じ、出てこないので自力でなんとかできないかちょっと調べて見ました。

とりあえず下は、WEBページにアクセスしてキャッシュするサンプルです。

&getCache(URL,名前空間,キャッシュ期限(秒));

という風に使います。

  • URLはキャッシュしたいURL
  • 名前空間は、指定した名前でキャッシュをそれ専用のフォルダ配下で管理する為のフォルダ名みたいな感じ。キャッシュルートの下にできるフォルダ名になります。
  • キャッシュ期限は、キャッシュの期限が切れるまでの秒数。3600なら1時間86400なら24時間です。

use strict;
use warnings;
use Cache::FileCache;
use LWP::Simple;

&getCache("http://www.yahoo.co.jp/","yahoo",86400);

#====================================================================
#   getCache
#====================================================================
sub getCache{
    my ($url,$namespace,$expires) = @_;

    my $cache = new Cache::FileCache({ ‘namespace’           => $namespace,         #名前空間
                                        ‘default_expires_in’ => $expires,           #期限秒
                                        ‘cache_root’         => "C:\\CACHE_TEMP",   #キャッシュフォルダのルート。
                                    });

    #有効期間内のキャッシュは存在するか?
    my $content = $cache->get($url);

    #なかった
    if ( not defined $content ){
        print "—– not defined\n";
        #ページ取得
        $content = get($url);

        #キャッシュ保存
        $cache->set( $url, $content);

        #期限切れキャッシュ削除
        $cache->Purge();
    }else{
        print "—– defined\n";
    }

    $content;
}

cache03.pl

実際にコマンドプロンプトから実行してみると、最初はnot definedが表示されて、二回目はdefinedになってキャッシュされているのがわかります。キャッシュ期限を数十秒とか短めにしてみるとキャッシュ期限が切れて再度not definedになるのがわかります。

F:\kumacchi\MyProgram\perl\sample\cache-filecache>perl cache03.pl
—– not defined

F:\kumacchi\MyProgram\perl\sample\cache-filecache>perl cache03.pl
—– defined

 

そして、作成されたキャッシュファイルを無理やりテキストエディタで開いてみると、Cache::ObjectやExpires_atやCreated_at等何やら気になる情報があります。作成日時や期限切れ日時の情報を普通に内部に持っている様ですね。

XG001644

Cache::CacheやCache::Objectのドキュメントをみると、どうやら、get_objectを使えば必要な情報が取得できそうなので試してみます。

◇関連:Cache::Cache — the Cache interface.
◇関連:Cache::Object — the data stored in a Cache.[http://cpan.uwinnipeg.ca/htdocs/Cache-Cache/Cache/Object.html]

 

実際のサンプルがこれ

use strict;
use warnings;
use Cache::FileCache;
use LWP::Simple;
#use Cache::Object;

&getCache("http://www.yahoo.co.jp/","yahoo",86400);

#====================================================================
#   getCache
#====================================================================
sub getCache{
    my ($url,$namespace,$expires) = @_;

    my $cache = new Cache::FileCache({ ‘namespace’           => $namespace,         #名前空間
                                        ‘default_expires_in’ => $expires,           #期限秒
                                        ‘cache_root’         => "C:\\CACHE_TEMP",   #キャッシュフォルダのルート。
                                    });

    #有効期間内のキャッシュは存在するか?
    my $content = $cache->get($url);

    #なかった
    if ( not defined $content ){
        print "—– not defined\n";
        #ページ取得
        $content = get($url);

        #キャッシュ保存
        $cache->set( $url, $content);

        #期限切れキャッシュ削除
        $cache->Purge();
    }else{
        print "—– defined\n";
    }

    my $object = $cache->get_object($url);
    my $created_at = $object->get_created_at();
    my $expires_at = $object->get_expires_at();

    print "created_at = $created_at". &getDay($created_at)."\n";
    print "expires_at = $expires_at". &getDay($expires_at)."\n";

    ($content,$created_at,$expires_at);
}

sub getDay{
    my ($ss,$mm,$hh,$dd,$MM,$YY,$WW,$dmy,$day) = localtime($_[0]);
    my $ret = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$YY+1900,$MM+1,$dd,$hh,$mm,$ss);
}

cache02.pl

コマンドプロンプトで実行してみると、以下のようになりました。どうやらうまくいったようです。

F:\kumacchi\MyProgram\perl\sample\cache-filecache>cache02.pl
—– not defined
created_at = 12581963392009-11-14 19:58:59
expires_at = 12582827392009-11-15 19:58:59

F:\kumacchi\MyProgram\perl\sample\cache-filecache>cache02.pl
—– defined
created_at = 12581963392009-11-14 19:58:59
expires_at = 12582827392009-11-15 19:58:59

F:\kumacchi\MyProgram\perl\sample\cache-filecache>

 

とりあえず、これでキャッシュ作成日時やキャッシュ期限の日時を取得する事ができるようになりました。

追記:2010.02.12

こちらの記事によると、期限切れキャッシュの削除にはPurge()ではなくpurge()を使うべきなようです。Purge()の場合はパラメータでパスを指定する必要があるようです。
Cache::FileCache の purge と Purge – makogの日記

タグ :