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