ElastiCached의 적용
ElastiCache는 주로 데이터베이스의 처리 결과를 메모리(RAM)에 저장했다가 다음 요청시에 저장된 결과를 반환하는 것을 통해서 에플리케이션을 빠르게 구동할 수 있게 해준다. 이번 시간에는 ElastiCache를 이용해서 데이터베이스의 로드를 줄이고 더 빠른 웹에플리케이션을 만드는 방법에 대해서 알아본다.
ElastiCache 준비
ElastiCache는 memcached의 API를 그대로 사용하기 때문에 PHP의 memcache API를 통해서 제어가 가능하다. 따라서 PHP가 구동하는 서버에 memcached와 memcached PHP 확장기능을 설치해야 한다. 방법은 아래와 같다. (우분투와 같은 데비안 계열)
memcached 설치
sudo apt-get install memcached
PHP memcached 확장기능 설치
sudo apt-get install php5-memcache
Apache 재시작
sudo /etc/init.d/apache2 restart;
PHP Memcached API
PHP의 Memcached API는 아래의 주소를 통해서 접속 할 수 있다.
주요 API는 아래와 같다.
bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )
- $host : 서버의 host
- $port : 서버의 포트
string Memcache::get ( string $key [, int &$flags ] )
- $key : 저장된 데이터의 key 값
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )
- $key : 데이터를 저장할 키 값, 데이터를 가져올 때 이 값을 사용한다.
- $var : 저장할 데이터
- $flag : MEMCACHE_COMPRESSED 를 사용하면 데이터를 저장할 때 압축한다.
-
$expire : 캐쉬가 생성한 직후부터 데이터의 유효기간을 초단위로 지정한다. 유효기간을 초과하면 자동으로 삭제된다. 이 값으로 0을 사용하면 데이터는 삭제되지 않는다.
예를들어 10을 지정하면 10초후에 캐슁된 데이터가 삭제된다.
예제
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > </head> <body> <a href="write.php">쓰기</a> <?php function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $time_start = microtime_float(); $msg = ''; $mcache = new Memcache; $mcache -> connect('opentutorials.master.cfg.apne1.cache.amazonaws.com:11211'); if(!$list = $mcache->get('list')){ mysql_connect('rds.master.ap-northeast-1.rds.amazonaws.com','egoing','22222222'); mysql_select_db('opentutorials'); mysql_query("set session character_set_connection=utf8;"); mysql_query("set session character_set_results=utf8;"); mysql_query("set session character_set_client=utf8;"); $sql = "SELECT * FROM topic"; $result = mysql_query($sql); $list = array(); while($row = mysql_fetch_assoc($result)){ array_push($list, $row); } $mcache -> set('list', $list, MEMCACHE_COMPRESSED, 10); $msg.= "Database"; } else { $msg.= "Cache"; } $time_end = microtime_float(); $time = $time_end - $time_start; ?> <ul> <?php foreach($list as $row){ echo "<li>{$row['title']}</li>"; } ?> </ul> <div style="margin-top:20px;"><?=$msg?></div> <div><?=date(DATE_RFC822)?></div> <div><?=$time?></div> </body> </html>