MogileFS::Client::WithCacheを書いた

MogileFS::Clientは通常、get_pathsで得られた結果をperlbal側にX-REPROX-CACHE-FORでキャッシュさせることでtracker(MySQL)へのアクセスを抑えるように運用するのが一般的ですが、たまにアプリ内でget_file_dataしてそれをもとに微妙にカスタマイズして画像を返したり、認証をつけたりしていると、毎回appサーバーにアクセスがきてしまいます。ということで、get_paths呼んだ前後でmemcachedにそのまま結果を透過的にキャッシュしてくれるやつを書いてみました。

http://github.com/walf443/p5-mogilefs-client-withcache

これを使うと、アプリ内でget_file_dataとか呼んでもget_pathsの結果はキャッシュを使ってくれるのでトラッカーへのアクセスを抑えることができます。また、ファイルの更新時にはキャッシュは破棄してくれるのでアプリレベルでの更新であれば特に気にしなくてよいです。(ただ裏でノード増やしてリバランスしたりとかそういうことをしたときはキャッシュのキーを変えたりする必要があるかと思います。)

使い方は基本的にはMogileFS::Clientを継承しているのでほぼ同じです。

  use MogileFS::Client::WithCache;
  use Cache::Memcached::Fast;
  my $cache = Cache::Memcached::Fast->new(
    servers => ['10.0.0.1:11211'],
    namespace => 'my_namespace',
  );
  my $mogilefs = MogileFS::Client::WithCache->new(
    domain  => 'foo.com::my_namespace',
    hosts   => ['10.0.0.2:7001', '10.0.0.3:7001'],
    cache   => $cache,
    namespace => 'my_namespace_mogile',
    cache_expire => 5 * 60, # 5 min.
  );

  # get with cache
  my @paths = $mogilefs->get_paths('some_key');-

  # update and clear cache.
  $mogilefs->store_content('some_key', 'some_class', 'content');

  # get_paths without caching.
  my @paths2 = $mogilefs->get_paths_without_cache('some_key');