Spec-Zone .ru
спецификации, руководства, описания, API

15.6.3.4. Используя MySQL и memcached с Perl

Cache::Memcached модуль обеспечивает собственный интерфейс для протокола Memcache, и оказывает поддержку для базовых функций, предлагаемых memcached. Установите модуль, используя систему управления пакета Вашей операционной системы, или использование CPAN:

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

Использовать memcached от Perl до Cache::Memcached модуль, сначала создайте новое Cache::Memcached объект, который определяет список серверов и других параметров для соединения. Единственным параметром является хеш, содержащий опции для интерфейса кэша. Например, чтобы создать новый экземпляр, который использует три 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 возвращает хеш, который содержит данные на основе узла узлом, так же как обобщенную статистику для всех серверов в группе.

Можно установить дополнительные свойства на экземпляре объекта кэша, когда он создается, определяя опцию как часть хеша опции. Альтернативно, можно использовать соответствующий метод на экземпляре:

Однажды Cache::Memcached объектный экземпляр был сконфигурирован, можно использовать set() и get() методы, чтобы сохранить и получить информацию от memcached серверов. Объекты, хранившие в кэше, автоматически сериализируются и десериализовывали использование Storable модуль.

Cache::Memcached интерфейс поддерживает следующие методы для того, чтобы хранить/получить данные, и коснитесь универсальных методов как показано в таблице.

Cache::Memcached Функция Эквивалентный Универсальный Метод
get() Универсальный get().
get_multi(keys) Становится многократным keys от memcache, использующего только onequery. Возвращает ссылку хеша пар ключ/значение.
set() Универсальный set().
add() Универсальный add().
replace() Универсальный replace().
delete() Универсальный delete().
incr() Универсальный incr().
decr() Универсальный decr().

Ниже полный пример для того, чтобы использовать memcached с Perl и Cache::Memcached модуль:

#!/usr/bin/perluse Cache::Memcached;use DBI;use Data::Dumper;# Configure the memcached servermy $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 underscoresmy $filmname = shift or die "Must specify the film name\n";my $filmkey = $filmname;$filmkey =~ s/ /_/;# Load the data from the cachemy $filmdata = $cache->get($filmkey);# If the data wasn't in the cache, then we load it from the databaseif (!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