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) | 하나의 쿼리만을 사용하여 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