서버에 Redis를 설치하고 사용하는 방법은 무엇인가요?
💡 요약 정리
- Redis는 고성능 메모리 캐싱 시스템으로 no-sql의 Memory DB입니다
- DB 부하를 줄이고 동적 웹 어플리케이션의 성능을 향상시킵니다
- make install로 설치 후 redis.conf 설정으로 데몬 모드 실행 가능합니다
- SET, GET, EXPIRE 등 다양한 명령어로 key-value 데이터를 관리합니다
- predis 라이브러리로 WordPress 컨텐츠 캐싱 연동이 가능합니다
1. redis 설치
[root@test ~]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz
[root@test ~]# tar xvf redis-2.8.17.tar.gz
[root@test ~]# cd redis-2.8.17
[root@test ~]# make
[root@test ~]# yum -y install tcl
[root@test ~]# make test
[root@test ~]# make install
2. redis 환경설정
[root@test ~]# cd redis-2.8.17
[root@test ~]# vi redis.conf
daemonize = yes로 변경합니다
maxclients 2048 로 변경후 저장합니다.
[root@test ~]# cp -a redis.conf /etc/redis.conf
3. /etc/sysctl.conf 설정추가
vm.overcommit_memory = 1
참조 : http://mimul.com/pebble/default/2013/05/10/1368171783727.html
[root@test ~]# sysctl -p ( vm.overcommit_memory 옵션을 바로 적용)
4. redis 실행
[root@test ~]# redis-server & # & <-- 옵션은 백그라운드로 실행하는 의미입니다
[root@test redis-2.8.17]#
[29102] 04 Nov 11:43:07.048 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
[29102] 04 Nov 11:43:07.050 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 2.8.17 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in stand alone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 29102
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
[30020] 04 Nov 11:45:31.922 # Server started, Redis version 2.8.17
[30020] 04 Nov 11:45:31.922 * The server is now ready to accept connections on port 6379
5. redis 포트 확인
[root@test redis-2.8.17]# netstat -tunlp | grep :6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 30020/redis-server
tcp 0 0 :::6379 :::* LISTEN 30020/redis-server
6. telnet 기본 명령어를 이용한 정상 작동여부 확인
몇가지 기본 명령어를 이용하여 Redis 서버가 정상적으로 작동하는지의 여부를 확인해 볼 수 있습니다. 기본적인 명령어를 몇 개 소개해 드립니다.
SET key value 해당 키를 해당 값으로 설정한다.
GET key 해당 키의 값을 가져온다.
MGET key [key ...] 여러개의 값을 가져온다.
EXPIRE key seconds 키의 타임아웃을 지정한다.
해당 seconds 이후에 key는 삭제된다.
[root@test redis-2.8.17]# telnet localhost 6379
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
SET key value
+OK
SET HANHWA EAGLES
+OK
SET KIA TIGERS
+OK
실제 서버에서 키를 몇 개 지정한 후, 키 값을 가져오면 다음과 같은 결과를 보여줍니다
redis 는 다양한 명령어를 사용할 수 있으며, redis의 전체 명령어는 다음 URL에서 확인할 수 있습니다.
http://redis.io/commands7. Redis를 이용한 WordPress 컨텐츠 Cache하기
1) Redis를 이용한 WordPress 컨텐츠 Cache하기
서버에 SSH 접 속하여 GIT로 predis 라이브러리를 다운로드 합니다. 아래 명령어를 사용하여 predis 라이브러리 다운로드 하면 predis 디렉토리가 생성된 것으로 확인 할 수 있습니다.
git clone git://github.com/nrk/predis.git
- git이 설치되어 있어야 합니다.
- predis는 php 5.3 이상 버전만을 지원합니다.
2) Redis가 연동된 Wordpress의 index.php 파일업로드
기존에 사용하던 index.php 파일을 index.php.bak 등으로 백업하신 후, 아래의 내용으로 index.php 파일을 생성하여 업로드 합니다. 본문 중, localhost로 표시된 부분은 Redis 광호스팅의 연결도메인을 입력하시고, 포트 번호는 나의서비스관리 메뉴에서 확인하여 입력해 주시기 바랍니다.
<?php
$services_json = json_decode(getenv("VCAP_SERVICES"),true);
$redis_config = $services_json["redis-2.2"][0]["credentials"];
/* 환경설정 */
define('REDIS_DEBUG', false);
define('REDIS_HOST', 'localhost') // Redis 호스팅 연결도메인
define('REDIS_PORT', '23381'); // 포트
define('WP_USE_THEMES', true);
require("./predis/lib/Predis/Autoloader.php");
PredisAutoloader::register();
$redis = new PredisClient(array(
'host' => REDIS_HOST,
'port' => REDIS_PORT,
'name' => REDIS_NAME,
'password' => REDIS_PASSWORD
));
$host = $_SERVER['HTTP_HOST'];
$url = "http://".$host.$_SERVER['REQUEST_URI'];
$key = md5($host);
$field = md5($url);
/* 조건 설정 */
$isModified = (isset($_SERVER['HTTP_CACHE_CONTROL']) && ($_SERVER['HTTP_CACHE_CONTROL'] == 'max-age=0')) ? true : false;
$isLoggedIn = preg_match("/wordpress_logged_in/", var_export($_COOKIE, true));
$isCached = $redis->hexists($key, $field);
if (REDIS_DEBUG) {
$start = microtime();
}
//로그인유무, 컨텐츠가 변경되었는지 여부, 캐시존재유무 Short-Cirtcuit Evalutation에 따라 redis 체크는 마지막에둠
if (!$isLoggedIn && !$isModified && $isCached) {
echo $redis->hget($key, $field);
}
// 컨텐츠가 변경되었다면, 댓글 남기기 등
else if ($isModified) {
require('./wp-blog-header.php');
$redis->hdel($key, $field);
}
// 로그인 되어 있을 경우, 캐시 하지 않음
else if ($isLoggedIn) {
require('./wp-blog-header.php');
}
else {
ob_start();
require('./wp-blog-header.php');
$html = ob_get_contents();
ob_end_clean();
echo $html;
$redis->hset($key, $field, $html);
}
if (REDIS_DEBUG) {
$end = microtime();
if (!$isLoggedIn && !$isModified && $isCached) {
echo '캐시된 문서';
}
else if($isModified) {
echo '캐시 삭제 후 DB에서 데이터 로드';
}
else if ($isLoggedIn) {
echo 'DB에서 데이터 로드';
}
else {
echo 'DB에서 데이터로드 후 캐시저장';
}
echo '페이지 생성시간: '.getExecutionTime($start, $end).'초';
}
function getExecutionTime($start, $end) {
$time = (getMillisecond($end) - getMillisecond($start));
return round($time,5);
}
function getMillisecond($time) {
list($usec, $sec) = explode(" ",$time);
return ((float)$usec + (float)$sec);
}
?>
문제가 해결되지 않았나요?
궁금하신 사항은 언제든지 1:1 문의게시판으로 문의해 주세요.
문의 시 포함 정보:
- 카페24 아이디
- 서비스 ID: 서버호스팅 서비스 ID
- 서버 OS: CentOS / Ubuntu 등
- Redis 버전: redis-server --version 명령 실행 결과
- PHP 버전: php -v 명령 실행 결과
- 문의 내용: Redis 설치 및 사용 관련 문의 사항