Perl-users.jp

Cache::Memcached::Fast

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 との互換性について

Cache::Memcached::Fast は、Cache::Memcached と互換性を保つように設計されています。

なお、下記の(わりと重要でないと思われる)ものは互換性がありませんので確認してください。

ハッシュの計算も互換性があります(servers の weight をすべて整数にし、その総和を 32768 より小さくすること)。

Cache::Memcached から乗り換えるに値する理由


目次へ

Last modified: $Date: 2008-05-22T09:21:23.154313Z $