Cache::Memcached::Managed ではまったこと
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もちろんつけるけど、テストではあんまつけないよねー。他にもはまってる人は絶対いるはずだ。いやいないか。