memcached 는 어떤 결과 값을 메모리 상에 올려 놓고 처리는 하는 프로그램이다.
예을 들자면 웹 게시판이 있다면 db에 게시판 글을 입력해고
사용자들이 게시판의 글을 읽을 때마다 db에 접속해서 데이타를 뽑아서 보여주는 데
이것을 처음 사용자가 글을 읽을 때는 db에서 뽑아서 보여주고 그 데이타는
캐쉬에 올려 놓고 다음 사용자가 글을 읽으면 캐쉬에 내용이 있는지를 확인해서
캐쉬에 있으면 db에 연결하지 않고 캐쉬에 있는 내용을 보여주면 된다.
그러면 db쪽에는 부하를 주지 않고 캐쉬 단위에서 처리가 가능하다.
실제로 웹페이지 구성이 DB에서 많은 쿼리를 통해 데이타를 가져다 보기 때문에
1페이지에 몇개에서 몇십개까지 db 쿼리를 던지는데 이것을
미리 결과값을 받아서 캐쉬에 있다가 전달하면 db에 대한 부하를 많이 줄일 수
있을 것 같습니다.
db내용이 변경이 되면 캐쉬에 내용도 지워기게 해야 업데이트 된 db내용을 다시 캐쉬하게 하면 된다.
이 캐쉬는 메모리에 등록이 된것이지기 때문에 서버가 리부팅이 된다면 없어진다.
캐쉬에 등록하는 php 함수는
bool Memcache::set ( string $key
, mixed $var
[, int $flag
[, int $expire
]] )
이것인데 expire 로 시간을 설정할 수 있다.
600 이라고 하면 600 초 뒤에는 캐쉬내용이 사라진다.
0 으로 하면 삭제나 리부팅 하기 전까지는 계속 남아 있다.
=====================================================================
memcached
yum install libevent-devel
yum -y install autoconf*
wget http://memcached.org/latest
tar xvfz latest
cd memcached-1.4.24
./configure --prefix=/home/memcached --enable-64bit
/home/memcached/bin/memcached -u daemon -m 64 -l 127.0.0.1 &
root@wll ~ # vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 16384 65534
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
root@wll ~ # sysctl -p
mkdir phpmemcache
/home/php/bin/pecl download memcache
tar xvfz memcache-2.2.7.tgz
/home/php/bin/phpize
./configure -with-php-config=/home/php/bin/php-config
make
cp memcache.php /home/php/lib/php
cp ./modules/memcache.so /home/php/lib/php/extensions
extension="/home/php/lib/php/extensions/memcache.so"
session.save_handler = memcache
session.save_path = "127.0.0.1:11211"
phpinfo();
로 확인
===========
<?
class CacheMemcache {
var $iTtl = 600; // Time To Live
var $bEnabled = false; // Memcache enabled?
var $oCache = null;
// constructor
function CacheMemcache() {
if (class_exists('Memcache')) {
$this->oCache = new Memcache();
$this->bEnabled = true;
if (! $this->oCache->connect('localhost', 11211)) { // Instead 'localhost' here can be IP
$this->oCache = null;
$this->bEnabled = false;
}
}
}
// get data from cache server
function getData($sKey) {
$vData = $this->oCache->get($sKey);
return false === $vData ? null : $vData;
}
// save data to cache server
function setData($sKey, $vData) {
//Use MEMCACHE_COMPRESSED to store the item compressed (uses zlib).
return $this->oCache->set($sKey, $vData, 0, $this->iTtl);
}
// delete data from cache server
function delData($sKey) {
return $this->oCache->delete($sKey);
}
}
?>
<?php
$aData = array(
'name' => 'table',
'color' => 'brown',
'size' => array(
'x' => 200,
'y' => 120,
'z' => 150,
),
'strength' => 10,
);
require_once('classes/memcache.caching.php');
$oCache = new CacheMemcache();
echo 'Initial data: <pre>'; // lets see what we have
print_r($aData);
echo '</pre>';
if ($oCache->bEnabled) { // if Memcache enabled
$oCache->setData('my_object', $aData); // saving data to cache server
$oCache->setData('our_class_object', $oCache); // saving object of our class into cache server too
echo 'Now we saved all in cache server, click <a href="index2.php">here</a> to check what we have in cache server';
} else {
echo 'Seems Memcache not installed, please install it to perform tests';
}
?>
<?php
require_once('classes/memcache.caching.php');
$oCache = new CacheMemcache();
if ($oCache->bEnabled) { // if Memcache enabled
$oCache->delData('my_object'); // removing data from cache server
$oCache->delData('our_class_object'); // removing data from cache server
$aMemData = $oCache->getData('my_object'); // lets try to get data again
$aMemData2 = $oCache->getData('our_class_object');
echo 'Data from cache server: <pre>'; // lets see what we have from cache server
print_r($aMemData);
echo '</pre>';
echo 'Data from cache server of object of CacheMemcache class: <pre>';
print_r($aMemData2);
echo '</pre>';
echo 'As you can see - all data successfully removed. Great !';
} else {
echo 'Seems Memcache not installed, please install it to perform tests';
}
?>