memcached へのアクセスは Cache::Memcached::Fast がオススメです。高速かつ安定して動作します。
use Cache::Memcached::Fast;
my $memd = new Cache::Memcached::Fast({
servers => [ { address => 'localhost:11211', weight => 2.5 },
'192.168.254.2:11211',
{ address => '/path/to/unix.sock', noreply => 1 } ],
namespace => 'my:',
connect_timeout => 0.2,
io_timeout => 0.5,
close_on_error => 1,
compress_threshold => 100_000,
compress_ratio => 0.9,
compress_methods => [ \&IO::Compress::Gzip::gzip,
\&IO::Uncompress::Gunzip::gunzip ],
max_failures => 3,
failure_timeout => 2,
ketama_points => 150,
nowait => 1,
hash_namespace => 1,
serialize_methods => [ \&Storable::freeze, \&Storable::thaw ],
utf8 => ($^V ge v5.8.1 ? 1 : 0),
max_size => 512 * 1024,
});
# サーバーのバージョンを得る
my $versions = $memd->server_versions;
while (my ($server, $version) = each %$versions) {
#...
}
# スカラー値をサーバーに送る
$memd->add('skey', 'text');
$memd->add_multi(['skey2', 'text2'], ['skey3', 'text3', 10]);
$memd->replace('skey', 'val');
$memd->replace_multi(['skey2', 'val2'], ['skey3', 'val3']);
$memd->set('nkey', 5);
$memd->set_multi(['nkey2', 10], ['skey3', 'text', 5]);
# 複雑なデータもサーバーに送る
my %hash = (a => 1, b => 2);
my @list = (1, 2);
$memd->set('hash', \%hash);
$memd->set_multi(['scalar', 1], ['list', \@list]);
# 文字列をキャッシュにくっつける
$memd->prepend('skey', 'This is a ');
$memd->prepend_multi(['skey2', 'This is a '], ['skey3', 'prefix ']);
$memd->append('skey', 'ue.');
Wait for all commands that were executed in nowait mode.
$memd->append_multi(['skey2', 'ue.'], ['skey3', ' suffix']);
# キャッシュ値を演算する
$memd->incr('nkey', 10);
print "OK\n" if $memd->decr('nkey', 3) == 12;
my @counters = qw(c1 c2);
$memd->incr_multi(['c3', 2], @counters, ['c4', 10]);
# データをとってくる
my $val = $memd->get('skey');
print "OK\n" if $val eq 'This is a value.';
my $href = $memd->get_multi('hash', 'nkey');
print "OK\n" if $href->{hash}->{b} == 2 and $href->{nkey} == 12;
# アトミックな操作もできます
my $cas_val = $memd->gets('nkey');
$$cas_val[1] = 0 if $$cas_val[1] == 12;
if ($memd->cas('nkey', @$cas_val)) {
print "OK, value updated\n";
} else {
print "Update failed, probably another client"
. " has updated the value\n";
}
# データを削除します
$memd->delete('skey');
my @keys = qw(k1 k2 k3);
$memd->delete_multi(@keys, ['k5', 20]);
# nowait モードのときに、すべてのコマンドが送られるのを待ちます
$memd->nowait_push;
# キャッシュを消します
$memd->flush_all;
いくつかの機能は、memcached の比較的新しいバージョンでしか使えません。
Cache::Memcached::Fast は、Cache::Memcached と互換性を保つように設計されています。
なお、下記の(わりと重要でないと思われる)ものは互換性がありませんので確認してください。
ハッシュの計算も互換性があります(servers の weight をすべて整数にし、その総和を 32768 より小さくすること)。
Last modified: $Date: 2008-05-22T09:21:23.154313Z $