perl 版の memcached の client を使ってみる。

速度比較の必要もあるので、Perl 版の memcached
クライアントを使ってみる。


Cache-Memcached-1.30 - client library for memcached (memory cache daemon) - metacpan.org
上記は、第1回 memcachedの基本:memcachedを知り尽くす|gihyo.jp … 技術評論社
によると、memcached の作成者による perl client らしい。

記事を見ながら出来るので、こっちを使ってみる。

CRC32*1 が必要らしいので、
String::CRC32 - Perl interface for cyclic redundancy check generation - metacpan.org
上記から取得。

う。make コマンドなんてインストールしてないぞ。

ぐぐったところ、MinGW を使うのが最近ではファッショナブルなのよ!ということなので、

MinGW | Minimalist GNU for Windows

より取得して、インストール。ミニマムインストールだと
make がデフォルトで選択されてないので、make を
インストール中に選択しておく。

展開した、CRC32 のディレクトリにいって、

>perl Makefile.PL
Set up gcc environment - 3.4.5 (mingw-vista special r3)
Checking if your kit is complete...
Looks good
Writing Makefile for String::CRC32

おけおけ。

>mingw32-make.exe Makefile
mingw32-make.exe: *** No rule to make target `C:\Perl\libConfig.pm', needed by `Makefile'.  Stop.

なにこれーーー。
なんだろうなあ、、、だからwindows面倒くさいんだよな・・・。

多分環境変数の設定か何かが中途半端なのかもしれないけど、時間使いたくないので、場当たり的に、

Makefile の中の DIRFILESEP の行を以下のように修正して再実行してみる。

DIRFILESEP = \\

再実行。

>mingw32-make.exe Makefile install
mingw32-make.exe: `Makefile' is up to date.
cp CRC32.pod blib\lib\String\CRC32.pod
cp CRC32.pm blib\lib\String\CRC32.pm
C:\Perl\bin\perl.exe C:\Perl\lib\ExtUtils\\xsubpp  -

...中略...

Installing C:\Perl\site\lib\String\CRC32.pm
Installing C:\Perl\site\lib\String\CRC32.pod
Appending installation info to C:\Perl\lib/perllocal.pod

うごいた。若干実行ログの内容に疑惑が無いでもないが、面倒なので気にせず次にいく。

>perl Makefile.PL
Set up gcc environment - 3.4.5 (mingw-vista special r3)
Checking if your kit is complete...
Looks good
Writing Makefile for Cache::Memcached

>mingw32-make.exe Makefile install
mingw32-make.exe: *** No rule to make target `C:\Perl\libConfig.pm', needed by `Makefile'.  Stop.

>vivi Makefile

>mingw32-make.exe Makefile install
mingw32-make.exe: `Makefile' is up to date.
cp lib/Cache/Memcached/GetParser.pm blib\lib\Cache\Memcached\GetParser.pm
cp lib/Cache/Memcached.pm blib\lib\Cache\Memcached.pm
Installing C:\Perl\html\site\lib\Cache\Memcached.html
Installing C:\Perl\site\lib\Cache\Memcached.pm
Installing C:\Perl\site\lib\Cache\Memcached\GetParser.pm
Appending installation info to C:\Perl\lib/perllocal.pod

途中、先ほどと同じエラーが出たので、無言で同じようにMakefile を修正している。


そして、参考URL*2より、ソースコードをそのまま頂く。

use strict;
use warnings;
use Cache::Memcached;

my $key = "foo";
my $value = "bar";
my $expires = 3600; # 1 hour
my $memcached = Cache::Memcached->new({
    servers => ["127.0.0.1:11211"],
    compress_threshold => 10_000
});

$memcached->add($key, $value, $expires);
my $ret = $memcached->get($key);
print "$ret\n";


memcached は以下のように、デバッグログを吐かせる設定で起動しておく。

memcached.exe -vv

上記 perl スクリプトを実行したところ、

>perl a.pl
bar

無事動いた。memcached 側のログはこんな感じ。

<1896 new client connection
<1896 add foo 0 3600 3
>1896 STORED
<1896 get foo
>1896 sending key foo
>1896 END
<1896 connection closed.

DIRFILESEP の修正は全く不可解だが、結果オーライで気にしないことにする。


memcachedデバッグログを切って、for 文挟んで、1万回ループとかやってみたが、

my $ret;
for(1..10000) {
	$ret = $memcached->get($key);
}

私の環境で、3,4秒くらい。まあこれはもうちょっとちゃんとパフォーマンスチェックする必要があるだろう。

*1:ノードの分散のロジックとして、まずキーのCRC値を求め、ノードの数で割った余りでサーバを決定しているらしい。なんというシンプル。

*2:第1回 memcachedの基本:memcachedを知り尽くす|gihyo.jp … 技術評論社