- 공유 링크 만들기
- X
- 이메일
- 기타 앱
웹 애플리케이션의 응답 속도가 느려 사용자 이탈률이 높아지고 있다면, 데이터베이스 부하를 줄이는 캐싱 전략이 필요합니다. Redis는 인메모리 기반으로 밀리초 단위 응답을 보장하며, 세션 관리부터 실시간 랭킹까지 다양한 시나리오에서 성능 병목을 해소할 수 있습니다. 이 글에서는 Redis의 동작 원리와 실무 환경에서 반드시 알아야 할 운영 노하우를 다룹니다.
| Redis 기본 개념과 세션 저장소 구축 초보자를 위한 완벽 정리 |
Redis란 무엇인가
Redis(Remote Dictionary Server)는 인메모리 키-값 저장소로, 디스크가 아닌 RAM에 데이터를 저장하여 극도로 빠른 읽기/쓰기를 제공합니다. 일반적인 디스크 기반 DB는 데이터를 영구 저장하고 일부만 메모리 캐시로 올리는 반면, Redis는 메모리를 1차 저장소로 사용하고 필요 시 디스크에 백업(RDB 스냅샷, AOF 로그)을 남기는 구조입니다.
- 주요 특징: String, Hash, List, Set, Sorted Set 등 다양한 자료구조 지원
- 성능: 대부분의 연산이 O(1) 시간 복잡도로 동작
- 활용 사례: 캐싱, 세션 저장소, 실시간 순위(Leaderboard), 메시지 큐
초보자가 자주 겪는 오해는 Redis를 npm 모듈처럼 설치하려는 것입니다. Redis는 독립적인 서버 프로세스이므로, 로컬 또는 Docker에서 Redis 서버를 먼저 구동한 뒤 애플리케이션에서 클라이언트 라이브러리로 접속해야 합니다.
Redis 설치 및 기본 설정
플랫폼별 설치 방법
- macOS (Homebrew):
brew install redis - Ubuntu/Debian:
sudo apt update && sudo apt install redis - Windows: MSI 설치 후
redis.windows-service.conf를redis.conf로 변경,requirepass설정 후redis-server실행 - Docker (권장):
docker pull redis
docker run -d -p 6379:6379 --name redis redis:latest --requirepass "your_password"
접속 및 동작 확인
기본 포트는 6379이며, redis-cli로 접속합니다.
- 로컬 접속:
redis-cli - 비밀번호 설정 시:
redis-cli -a your_password - Docker 컨테이너 내부:
docker exec -it redis redis-cli -a your_password - 동작 확인:
PING입력 시PONG응답이 오면 정상
보안 필수 설정: 운영 환경에서는 반드시 requirepass로 비밀번호를 설정하고, 방화벽으로 외부 접근을 제한하십시오. 기본 포트(6379)를 그대로 노출하면 무차별 대입 공격에 취약합니다.
핵심 명령어와 운영 시 주의사항
기본 명령어
- 문자열 저장:
SET user:100:name "홍길동" - TTL과 함께 저장:
SET email:token:abc123 "verified" EX 30(30초 후 자동 삭제) - 조회:
GET user:100:name - 삭제:
DEL user:100:name - 존재 확인:
EXISTS user:100:name - 남은 TTL 확인:
TTL email:token:abc123(반환값: -2=키 없음, -1=만료 없음, 양수=남은 초)
운영 환경에서 절대 하지 말아야 할 것
Redis는 싱글스레드(멀티플렉싱) 구조이므로, O(N) 명령어가 실행되는 동안 다른 모든 요청이 블로킹됩니다.
- KEYS 명령 금지:
KEYS *는 전체 키를 스캔하여 서비스 장애를 유발합니다. 대신SCAN 0 MATCH user:* COUNT 100을 반복 호출하여 커서 기반으로 조회하십시오. - 대량 삭제 시:
DEL대신UNLINK를 사용하면 비동기로 삭제되어 블로킹을 최소화합니다. - FLUSHALL/FLUSHDB: 전체 데이터를 즉시 삭제하므로, 운영 환경에서는 절대 실행하지 마십시오. 복구 불가능합니다.
키 네이밍 컨벤션
콜론(:)으로 계층적 네임스페이스를 구성하면 관리가 용이합니다.
users:100:profileorders:2026:123cache:product:detail:5678
이 방식은 RedisInsight 같은 GUI 도구에서 폴더 구조처럼 시각화되어 직관적입니다.
캐싱을 통한 성능 최적화 원리
Cache Hit vs Cache Miss
애플리케이션이 데이터를 요청할 때, Redis에 데이터가 있으면 Cache Hit(즉시 반환), 없으면 Cache Miss(DB 조회 후 Redis에 저장)가 발생합니다. Cache Hit 비율이 높을수록 DB 부하가 줄고 응답 속도가 빨라집니다.
세션 저장소로 활용
톰캣 내장 메모리 세션은 서버 재시작 시 초기화되고, 다중 WAS 환경에서는 세션 공유가 불가능합니다. Redis를 세션 저장소로 사용하면:
- 여러 WAS 인스턴스가 동일한 세션을 공유
- 서버 재시작 시에도 세션 유지
- DB 기반 세션 저장소보다 응답 속도가 빠름 (메모리 접근 vs 디스크 IO)
주의: 클라우드 환경에서는 Managed Redis(AWS ElastiCache, Azure Cache for Redis 등)를 사용하면 고가용성과 자동 백업을 제공받을 수 있으나, 비용이 발생합니다. 트래픽이 적은 내부 시스템이라면 DB 기반 세션 저장소로 비용을 절감할 수 있습니다.
데이터 지속성과 복구 전략
Redis는 인메모리 특성상 전원 장애 시 데이터가 손실될 수 있습니다. 이를 방지하기 위한 지속성 옵션:
- RDB (스냅샷): 특정 시점의 메모리 상태를 디스크에 저장. 복구 속도가 빠르지만, 마지막 스냅샷 이후 데이터는 유실 가능
- AOF (Append Only File): 모든 쓰기 명령을 로그로 기록. 데이터 손실을 최소화하지만, 파일 크기가 커지고 복구 시간이 길어질 수 있음
- 권장: RDB와 AOF를 함께 활성화하여 안정성과 복구 속도를 모두 확보
메모리 관리
Redis는 Copy-on-Write 방식으로 스냅샷을 생성하므로, 메모리 사용량이 순간적으로 2배 가까이 증가할 수 있습니다. 물리 메모리의 50% 이상을 여유로 확보하고, maxmemory 정책(예: allkeys-lru)을 설정하여 메모리 초과 시 자동으로 오래된 키를 삭제하도록 구성하십시오.
정리 및 실행 가이드
핵심 요약
- Redis는 인메모리 키-값 저장소로, 밀리초 단위 응답 속도를 제공하며 캐싱/세션/실시간 데이터 처리에 최적화되어 있습니다.
- 운영 환경에서는 KEYS 대신 SCAN, DEL 대신 UNLINK를 사용하고, requirepass와 방화벽으로 보안을 강화해야 합니다.
- 데이터 지속성을 위해 RDB+AOF를 조합하고, 메모리 여유분을 충분히 확보하며, maxmemory 정책을 반드시 설정하십시오.
당장 실행할 수 있는 Action Item
Docker로 Redis를 로컬에 띄우고(docker run -d -p 6379:6379 --name redis redis:latest --requirepass "test1234"), redis-cli로 접속하여 SET cache:test "Hello Redis" EX 60과 GET cache:test를 실행해보십시오. 60초 후 TTL cache:test로 자동 만료를 확인하면, Redis의 캐싱 동작 원리를 체감할 수 있습니다.
#함께 읽으면 좋은 글
SQL JOIN 종류 완벽 정리: INNER LEFT RIGHT FULL OUTER 차이점과 Self Join 활용법 : 바로보기
댓글
댓글 쓰기