Redis는 인메모리 데이터 구조 저장소로, 일본 서버에서 웹 서비스 성능을 크게 향상시킬 수 있는 도구입니다. DB 쿼리 결과를 캐싱하고, 세션을 저장하며, 메시지 대기열을 구현하는 데 널리 사용됩니다.

Redis가 필요한 이유

웹 서비스에서 데이터베이스는 대부분 디스크에서 데이터를 읽습니다. Redis는 데이터를 메모리(RAM)에 저장하므로 조회 속도가 데이터베이스 대비 수십~수백 배 빠릅니다.

대표적인 활용 사례:

  • 오브젝트 캐시: DB 쿼리 결과를 Redis에 저장해 반복 쿼리 제거
  • 세션 저장: PHP, Node.js 세션을 Redis에 저장
  • 속도 제한(Rate Limiting): API 요청 횟수 제한
  • 메시지 대기열: 비동기 작업 처리
  • 실시간 기능: 채팅, 알림 등 Pub/Sub 구현

1단계: Redis 설치

apt update
apt install redis-server -y

# 서비스 시작 및 자동 시작
systemctl enable redis-server
systemctl start redis-server

# 버전 확인
redis-server --version

# 동작 테스트
redis-cli ping
# 응답: PONG

2단계: Redis 기본 설정

nano /etc/redis/redis.conf

메모리 제한 설정

# 최대 메모리 설정 (서버 RAM의 25~30%)
maxmemory 512mb

# 메모리 초과 시 정책 (캐시 용도라면 allkeys-lru)
maxmemory-policy allkeys-lru

보안 설정 (비밀번호)

# 비밀번호 설정
requirepass 강력한비밀번호

# 외부 접근 차단 (로컬만 허용)
bind 127.0.0.1 ::1

영속성 설정 (선택)

캐시 목적이라면 영속성을 비활성화해 성능을 높일 수 있습니다:

# RDB 스냅샷 비활성화 (캐시 전용)
save ""

# AOF 비활성화
appendonly no
systemctl restart redis-server

3단계: 주요 Redis 명령어

# Redis CLI 접속
redis-cli -a 비밀번호

# 기본 조작
SET key value          # 값 저장
GET key                # 값 조회
DEL key                # 키 삭제
EXISTS key             # 키 존재 확인
EXPIRE key 3600        # TTL 설정 (초)
TTL key                # 남은 TTL 확인

# 문자열
SET user:1:name "홍길동"
GET user:1:name

# 해시 (오브젝트 저장)
HSET user:1 name "홍길동" email "hong@example.com"
HGET user:1 name
HGETALL user:1

# 리스트 (대기열)
RPUSH queue:email "task1"
LPOP queue:email

# 모니터링
INFO memory         # 메모리 사용량
INFO stats          # 통계
DBSIZE              # 총 키 수

4단계: 언어별 Redis 연동

PHP (WordPress 오브젝트 캐시)

apt install php8.1-redis -y
systemctl restart php8.1-fpm

WordPress에서 Redis Object Cache 플러그인 설치 후 wp-config.php에 추가:

define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PASSWORD', '비밀번호');
define('WP_REDIS_DATABASE', 0);

Node.js (ioredis)

npm install ioredis
const Redis = require('ioredis');
const redis = new Redis({
  host: '127.0.0.1',
  port: 6379,
  password: '비밀번호',
});

// 캐시 패턴
async function getUser(id) {
  const cached = await redis.get(`user:${id}`);
  if (cached) return JSON.parse(cached);

  const user = await db.findUser(id);  // DB 조회
  await redis.setex(`user:${id}`, 3600, JSON.stringify(user));  // 1시간 캐시
  return user;
}

Python (redis-py)

pip install redis
import redis
import json

r = redis.Redis(host='127.0.0.1', port=6379, password='비밀번호', decode_responses=True)

def get_cached_data(key, fetch_func, ttl=3600):
    cached = r.get(key)
    if cached:
        return json.loads(cached)

    data = fetch_func()
    r.setex(key, ttl, json.dumps(data, ensure_ascii=False))
    return data

5단계: 세션 저장소로 활용

PHP 세션을 Redis에 저장

apt install php8.1-redis -y
# /etc/php/8.1/fpm/php.ini
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=비밀번호"

세션 관리가 Redis로 이관되어 여러 서버 간 세션 공유도 가능해집니다.


Redis 성능 확인

# 성능 벤치마크
redis-benchmark -a 비밀번호 -q -n 100000

# 히트율 확인 (keyspace_hits / (keyspace_hits + keyspace_misses))
redis-cli -a 비밀번호 info stats | grep keyspace

캐시 히트율이 80% 이상이면 Redis가 효과적으로 동작하는 것입니다.


마치며

Redis를 일본 서버에 도입하면 데이터베이스 부하를 크게 줄이고 응답 속도를 개선할 수 있습니다. 특히 트래픽이 많은 서비스에서 효과가 두드러집니다. Redis 설정에 대한 문의는 TCP-80.NET 텔레그램 @tcp80net으로 주세요.