아마존 웹서비스

ElastiCache와 웹서비스 (PHP)

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>

댓글

댓글 본문
  1. kimsh
    redis로 생성하고, EC2 php 로 접근 가능한 방법은 없을까요?
  2. lovevirus
    ElastiCache 프리티어로 사용할 경우 최대 동시 연결 수가 어떻게 되나요 ?
  3. stargt
    대화보기
    • 아트인
      워드프레스나 XE 같은 CMS에 기본으로 캐시 기능이 있을 때 php가 설치된 ec2 서버의 메모리를 이용할거 같은데요..빠른 성능을 위해서 아마존 엘라스틱캐시를 이용하기로 하면 CMS의 기본 캐시 기능을 어떻게 해야 할까요?
      대화보기
      • egoing
        좀 더 많은 맥락을 알려주시면 더 정확한 답변을 할 수 있을 것 같습니다.
        2012. 12. 13. 오후 8:16 "Disqus" <notifications@disqus.net> 작성:</notifications@disqus.net>
        대화보기
        • 아트인
          CMS로 웹서비스를 할 때 ElastiCache를 사용한다고하면 CMS의 기본 cache 기능을 끄고 ElastiCache만을 사용하게 되나요?
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기