Perl の Cache::File モジュールが便利なのでメモ。
一定期間使いますようなデータをファイルに保存しといて後から再利用する感じ。
では早速使い方から
サンプルその1
データ「hoge」を「mykey」という名前で 60 秒キャッシュしておく。
#!/usr/bin/perl
use strict;
use warnings;
use Cache::File;
my $param = {
cache_root => '/tmp/mycache',
default_expires => '60sec'
};
my $key = 'mykey';
my $data = 'hoge';
my $c = new Cache::File($param);
my $cache = $c->get($key);
if (!$cache) {
$c->set($key, $data);
$cache = $c->get($key);
print "write: $cache\n";
} else {
print "read: $cache\n";
}
exit
$c->get($key) で有効期間内ならキャッシュデータが、有効期間切れ、もしくは存在しない場合は undef が返るのでその時はキャッシュを作る。
キャッシュ関連のファイルは /tmp/mycache 配下に作成。
サンプルその2
先ほどのコードを少しだけ変えて、ハッシュとかオブジェクトのデータをそのままキャッシュできるようにする。
#!/usr/bin/perl
use strict;
use warnings;
use Cache::File;
my $param = {
cache_root => '/tmp/mycache',
default_expires => '60sec'
};
my $key = 'mykey';
my $data = {
str => 'hoge',
num => 12345
};
my $c = new Cache::File($param);
my $cache = $c->thaw($key);
if (!$cache) {
$c->freeze($key, $data);
$cache = $c->thaw($key);
print "write: $cache->{str}, $cache->{num}\n";
} else {
print "read: $cache->{str}, $cache->{num}\n";
}
exit
$c->thaw($key) でデシリアライズ、$c->freeze($key, $data) でシリアライズって認識でいいのかな。
その他のメソッド
他にもあるけど使いそうなメソッドをメモ。
# $key のキャッシュを削除
$c->remove($key);
# 有効期間切れのキャッシュを全て削除
$c->purge();
# 全てのキャッシュを削除
$c->clear();
# キャッシュファイルのパスを取得
my $path = $c->cache_file_path($key);
# キャッシュファイルの容量を取得
my $size = $c->size($key);
# キャッシュされているファイル数を取得
my $count = $c->count();
# キャッシュ $key の有効期間を設定
$c->set_expiry($key, time() + 600);
# キャッシュ $key の有効期間を取得
my $expir = $c->expiry($key);
# $key のキャッシュファイルの存在チェック
my $bool = $c->exists($key);
ちょっと怪しいところもあるけどこんな認識で良いと思う。
$c->exists($key) でチェックした時にキャッシュの有効期間が切れてるとついでに削除される模様。
とりあえず、Cache::File のメモ書きは以上です。