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 );

どうでしょうか。