Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


16.6.3.4 Perl での MySQL と memcached の使用

Cache::Memcached モジュールは、Memcache プロトコルへのネイティブインタフェースを提供し、memcached に用意されているコア関数をサポートします。このモジュールは、オペレーティングシステムのパッケージ管理システムまたは CPAN を使用してインストールします。

root-shell> perl -MCPAN -e 'install Cache::Memcached'

Perl から Cache::Memcached モジュールを介して memcached を使用するには、最初に接続用のサーバーリストとその他のパラメータを定義する新しい Cache::Memcached オブジェクトを作成します。唯一の引数は、キャッシュインタフェース用のオプションを含むハッシュです。たとえば、3 台の memcached サーバーを使用する新しいインスタンスを作成するには:

use Cache::Memcached;

my $cache = new Cache::Memcached {
    'servers' => [
        '192.168.0.100:11211',
        '192.168.0.101:11211',
        '192.168.0.102:11211',
	],
};
注記

複数のサーバーとともに Cache::Memcached インタフェースを使用すると、この API はグループ内のすべてのサーバーに対して特定の操作を自動的に実行します。たとえば、Cache::Memcached を介して統計情報を取得すると、ホスト単位のデータを含むハッシュとともに、グループ内のすべてのサーバーに関して一般化された統計が返されます。

キャッシュオブジェクトインスタンスの作成時にインスタンスに対して追加のプロパティーを設定するには、オプションのハッシュの一部としてそのオプションを指定します。または、インスタンスに対して対応するメソッドを使用することもできます。

  • servers または set_servers() メソッド: 使用されるサーバーのリストを指定します。このサーバーリストは、各要素がアドレスとポート番号の (コロンで区切られた) 組み合わせであるサーバー配列への参照です。Unix ソケットによるローカル接続を指定することもできます (たとえば、/tmp/sock/memcached)。(ハッシュ化時にどの程度の頻度でそのサーバーを使用すべきかを示す) 重み付きでサーバーを指定するには、memcached サーバーインスタンスと重み値を含む配列参照を指定します。数値が大きいほど、優先度が高くなります。

  • compress_threshold または set_compress_threshold() メソッド: 値を圧縮するときのしきい値を指定します。指定した数値より大きい値は、格納時および取得時に (zlib を使用して) 自動的に圧縮されます。

  • no_rehash または set_norehash() メソッド: 最初に選択したサーバーが使用できなかった場合に、新しいサーバーの検索を無効にします。

  • readonly または set_readonly() メソッド: memcached サーバーへの書き込みを無効にします。

Cache::Memcached オブジェクトインスタンスを構成したあとは、set() および get() メソッドを使用すると memcached サーバーの情報を格納および取得できます。キャッシュに格納されているオブジェクトは、Storable モジュールを使用して自動的に直列化および直列化解除されます。

Cache::Memcached インタフェースは、データを格納/取得するために次のメソッドをサポートします。これらは、表に示すように汎用のメソッドと関連しています。

Cache::Memcached の関数 同等の汎用メソッド
get() 汎用の get()
get_multi(keys) 1 つのクエリーのみを使用して memcache から複数の keys を取得します。キー/値ペアのハッシュ参照を返します。
set() 汎用の set()
add() 汎用の add()
replace() 汎用の replace()
delete() 汎用の delete()
incr() 汎用の incr()
decr() 汎用の decr()

Perl および Cache::Memcached モジュールで memcached を使用する完全な例を次に示します。

#!/usr/bin/perl

use Cache::Memcached;
use DBI;
use Data::Dumper;

# Configure the memcached server

my $cache = new Cache::Memcached {
    'servers' => [
                   'localhost:11211',
                   ],
    };

# Get the film name from the command line
# memcached keys must not contain spaces, so create
# a key name by replacing spaces with underscores

my $filmname = shift or die "Must specify the film name\n";
my $filmkey = $filmname;
$filmkey =~ s/ /_/;

# Load the data from the cache

my $filmdata = $cache->get($filmkey);

# If the data wasn't in the cache, then we load it from the database

if (!defined($filmdata))
{
    $filmdata = load_filmdata($filmname);

    if (defined($filmdata))
    {

# Set the data into the cache, using the key

	if ($cache->set($filmkey,$filmdata))
        {
            print STDERR "Film data loaded from database and cached\n";
        }
        else
        {
            print STDERR "Couldn't store to cache\n";
	}
    }
    else
    {
     	die "Couldn't find $filmname\n";
    }
}
else
{
    print STDERR "Film data loaded from Memcached\n";
}

sub load_filmdata
{
    my ($filmname) = @_;

    my $dsn = "DBI:mysql:database=sakila;host=localhost;port=3306";

    $dbh = DBI->connect($dsn, 'sakila','password');

    my ($filmbase) = $dbh->selectrow_hashref(sprintf('select * from film where title = %s',
                                                     $dbh->quote($filmname)));

    if (!defined($filmname))
    {
     	return (undef);
    }

    $filmbase->{stars} =
	$dbh->selectall_arrayref(sprintf('select concat(first_name," ",last_name) ' .
                                         'from film_actor left join (actor) ' .
                                         'on (film_actor.actor_id = actor.actor_id) ' .
                                         ' where film_id=%s',
                                         $dbh->quote($filmbase->{film_id})));

    return($filmbase);
}

この例では、Sakila データベースを使用して、データベースから映画のデータを取得し、映画と俳優の複合レコードを memcached に書き込みます。ある映画を要求したときに、それが存在しなかった場合は、この結果が得られます。

shell> memcached-sakila.pl "ROCK INSTINCT"
Film data loaded from database and cached

キャッシュにすでに追加されている映画にアクセスするとき:

shell> memcached-sakila.pl "ROCK INSTINCT"
Film data loaded from Memcached