読者です 読者をやめる 読者になる 読者になる

Cache::Memcached::Managed ではまったこと

perl

Cache::Memcached::Managedを試しにさわっててはまったことをメモしとく。
C::M::Managedはキャッシュのキーをサブルーチンの完全修飾名から自動生成してくれるらしいので、そのテストをしてた。
テストに使ったクラス

package Hoge;
use strict;
use warnings;
use base qw/Class::Accessor::Fast/;

__PACKAGE__->mk_accessors(qw/memdm/);

sub cache {
    my $self = shift;
    if ( my $data = $self->memdm->get ) {
        print $data, "\n";
    } else {
        $self->memdm->set('data') and print "set OK\n";
    }
}
1;

main

use strict;
use warnings;
use Hoge;
use Cache::Memcached::Managed;

my $memdm = Cache::Memcached::Managed->new('127.0.0.1:11211');
$memdm->flush_all;
my $hoge = Hoge->new({ memdm => $memdm });

$hoge->cache;
$hoge->cache;
$hoge->cache;

実はこれだとキャッシュが全くsetできない。
かなり悩んで、デバッガで追ってみたら、

Cache::Memcached::Managed::get(/usr/local/lib/perl5/site_perl/5.10.0/Cache/Memcached/Managed.pm:446):
446:        $self->data->get( $data_key );

  DB<1> print $data_key
500#-1, set by base.pm#Hoge::cache

こりゃ駄目だ。keyにスペースが入ってる。*1
頭から、userID、パッケージのVERSION、呼び出し元サブルーチンの完全修飾名をデリミタで繋いでる様子なので、Hoge.pmにVERSIONを設定してみる。

our $VERSION = 0.01;

で、mainを実行してみると、

set OK
data
data

いけたいけた。
デバッガで再度見てみると、

  DB<1> print $data_key
500#0.01#Hoge::cache

うんうん。
で、ここまできてドキュメントをよくみたら、

version management

The version indicates which version (generation) of the data is to be fetched or stored. By default, it takes the value of the $VERSION variable of the package to which the key is associated. This allows new modules that cache information to be easily installed in a server park without having to fear data format changes.

最初からよく読んどけということだ。モジュールのバージョンを上げたときにキーをリセットできるようになってるんですね。

本番環境ではVERSIONもちろんつけるけど、テストではあんまつけないよねー。他にもはまってる人は絶対いるはずだ。いやいないか。

*1:たしかmemcachedの仕様で使えない