データをどのようにキャッシュするか #14B!

こんにちわ!nekokakです!

十四日目はDBIx::Skinnyでどのようにデータをキャッシュし、

キャッシュしたデータをどう扱うかについてです。

アプリケーションの負荷軽減策の一つとしてデータをmemcachedにキャッシュしてしまい、

DBアクセスをすくなくすることで、レスポンスを早くする手法はみなさん良く使われていると思います。

DBIx::SkinnyではSkinny自体の機能として、データを透過キャッシュするなどの便利機能は存在していません。

そこで、いろいろ工夫擦る必要があります。

なぜ、DBIx::Skinnyにデータの透過キャッシュする便利機能がないんだと思う人もいるかも知れません。

しかしDBIx::Skinnyの思想としてはDBIへのシンプルなwrapperなので、それ以上のことがしたければ、

DBIx::Skinny自体をラップしてくくださいと言う方針です。

また、データのキャッシュについても、DBIx::Skinny側でキャッシュ方法を明確に決めてしまわず、

ユーザの必要なケースに応じてキャッシュしてもらった方が効率が良いと考えたからです。

では、早速データのキャッシュ方法についてみていきましょう。

# キャッシュしたいユーザ情報を取得
my $user = $db->single('user', {name => 'nekokak'});
my $row = $user->get_columns; # get_columnsメソッドでデータをhashref化
my $cache = Cache::Memcached::Fast->new(....); # memcachedに接続
$cache->set('nekokak' => $row); # データをmemcachedにset

これだけです。

これでnekokakというキーでuserデータがmemcachedにキャッシュされました。

簡単ですよね。

次に、memcachedにキャッシュしたデータをどのように扱うかです。

my $cache = Cache::Memcached::Fast->new(....); # memcachedに接続
my $row = $cache->get('nekokak'); # memcachedからデータを取得
# memcachedから取得したデータをDBIx::SkinnyのRowオブジェクトにもどす
my $user = $db->data2itr('user', [$row])->first;

memcachedに入っているデータをDBIx::SkinnyのRowにもどしてしまえば、

あとはそのデータがDBから取得したものなのか、DBから取得したものなのかを気にする必要は全くありません。

簡単ですね。

明日は、今回でてきたdata2itrメソッドについて掘り下げていこうかと思います。

have a nice skinny days!:)