Cache::Funkyの使い方 - Cacheの処理の時にするフローを一般化できます。
CPANにCache::Funkyというモジュールがあるのだが、少し更新した。更新内容は、引数を受けれるようにした。
作成動機
IP規制の為のIPリストとか、処理が重たいところとか、マスター的なデータの一覧とかで、あまり更新されないデータを毎回DBに取りにいくのはあまり良くない。
で、キャッシュに突っ込んで、更新が会った際にはデータを消して、とる時にはキャッシュがなければ、実際のコードからとるという処理を書く。
この辺の処理を、もう少しかっこ良くしたいということで、 ニュービソンとかで、id:kopugが作った。
簡単な使い方
ファイルから読み込みむ、ブラックIPリストと、DBからとってくるホワイトIPリスト取得するCache::Funkyモジュールを作ってみる。(実際のコードはめんどくさいので書かない)
package X::Cache::IP; use strict; use warnings; use base qw/Cache::Funky/; my $BLACK_FILE = '/tmp/blackips'; __PACKAGE__->setup( 'Storage::Memcached' => { servers => [ '127.0.0.1:12345' ] }); __PACKAGE__->register( 'blacks', sub { # read data from $BLACK_FILE #... データを取って、格納するコードを書く return $data; } ); __PACKAGE__->register( 'whites' , sub { # DBに接続が必要な際は、ハンドルをパッケージ変数に入れてやる感じ。 my $dbh = $X::DBH; # dbh を使ってデータをとるコード return $data; } ); 1;
で使う時。キャッシュがあるかないかのコードを考える必要がないのがキーポイント。
use X::Cache::IP; my $blacklist = X::Cache::IP->blacks(); my $whitelist = X::Cache::IP->whites();
データが更新された時
データの取得コードはすでに登録されているので、更新の時はキャッシュにあるデータを消すだけでいい。
use X::Cache::IP; # ブラックリスト更新した時 X::Cache::IP->delete( 'blacks' );
こんなカンジで使えます。どうでしょうか。
ストレージを選択できる
ストレージを各自で作成できる作りになっています。現在、Simple, Memcached と2つありますね。
Simpleは一つのプロセスで使う限りはいいですが、複数になった場合、おかしくなるので使用しない方がいいです。
もし良ければ、どなたか追加で作成してく貰えれば良いかと思います。
例えばユーザごとのデータをキャッシュしたい時
これを、今回の更新でできるようにしました。以下のような感じで、ユーザIDを使用して、データを取得するコードを書けば良いと思います。
my $user = MyCache->user_info( 23345 );
消去の時
MyCache->delete('user_info' , 23345 );
どうでしょうか。