Redis는 메모리 기반의 고성능 NoSQL 데이터베이스로, 주로 캐시, 세션 관리, 실시간 분석 등에 사용됩니다. 전통적인 관계형 데이터베이스(RDBMS)와 달리, Redis는 구조화된 스키마나 SQL 쿼리 없이도 빠른 읽기/쓰기 작업을 지원합니다.
데이터베이스 유형 비교
관계형 데이터베이스(RDBMS)
테이블 간 참조 무결성, 외래키 제약, 트랜잭션, 뷰, 저장 프로시저 등을 제공하는 시스템입니다. MySQL, PostgreSQL, Oracle 등이 대표적입니다. 모든 조작은 SQL 문으로 수행되며, 데이터 일관성 보장에 중점을 둡니다.
NoSQL 데이터베이스
"Not Only SQL"을 의미하며, 다양한 데이터 모델(키-값, 문서, 그래프, 열 지향 등)을 지원합니다. 유연한 스키마, 수평 확장성, 높은 처리량을 특징으로 합니다. Redis는 그중 키-값 저장소(Key-Value Store)의 대표 격입니다.
Redis의 핵심 특징
- 메모리 중심 아키텍처: 대부분의 데이터가 RAM에 적재되어 초저지연 응답 가능
- 영속성 지원: RDB(정기 백업) 및 AOF(명령어 로그) 방식으로 데이터 손실 최소화
- 멀티데이터 타입: string, hash, list, set, sorted set 등 5가지 기본 자료구조 제공
- 단일 스레드 + 비동기 I/O: 원자성 보장과 예측 가능한 성능 유지
- 분산 환경 지원: 복제(Replication), 센티널(Sentinel), 클러스터(Cluster)를 통한 고가용성 구성
설치 및 실행
Linux(Ubuntu) 설치 예시
sudo apt update && sudo apt install redis-server -y
sudo systemctl enable redis-server
sudo systemctl start redis-server
# 설정 파일 위치: /etc/redis/redis.conf
Windows 환경 (공식 비지원, Microsoft 포크 버전 활용)
redis-server.exe redis.windows.conf
# 서비스 등록
redis-server --service-install redis.windows.conf
redis-server --service-start
클라이언트 접속
redis-cli -h 127.0.0.1 -p 6379
# 인증이 필요한 경우
redis-cli -a your_password
주요 설정 항목(redis.conf)
| 설정 항목 | 설명 | 권장 값 |
|---|---|---|
bind 127.0.0.1 | 바인딩 IP 주소 (외부 접근 허용 시 주석 해제) | 127.0.0.1 |
port 6379 | 서버 리스닝 포트 | 6379 |
daemonize yes | 데몬 모드 실행 여부 | yes |
requirepass your_secret | 접근 암호 설정 (생산 환경 필수) | 비활성화 시 주석 처리 |
save 900 1 | RDB 자동 저장 조건 (900초 내 1개 변경 시) | 필요에 따라 조정 |
appendonly yes | AOF 영속성 활성화 | yes (안정성 우선 시) |
기본 데이터 타입 및 연산
String — 단순 키-값 쌍
# 기본 저장 및 조회
SET user:1001 "Kim Min-Jae"
GET user:1001
# 조건부 저장 (존재하지 않을 때만)
SETNX lock:order:20240501 "acquired"
# 만료 시간 설정 (초 단위)
SETEX session:abc123 1800 "logged_in"
# 증감 연산
INCR counter:page_views
DECRBY inventory:item_001 3
# 비트 조작 (월별 출석 체크)
SETBIT attendance:202405:12345 12 1 # 13일 출석
BITCOUNT attendance:202405:12345 # 총 출석일 수
Hash — 구조화된 객체 저장
# 사용자 정보 저장
HSET user:1002 name "Lee Soo-Jin" age "28" role "admin"
HGET user:1002 name
HGETALL user:1002
# 필드별 증감
HINCRBY user:1002 score 10
# 존재 여부 확인
HEXISTS user:1002 email
List — 큐/스택 기반 구조
# 메시지 큐 구현
LPUSH queue:notifications "New comment on post #42"
RPOP queue:notifications
# 최근 활동 목록 유지 (최대 100개)
LTRIM activity:user:789 0 99
Set — 중복 제거 집합
# 관심사 태그 관리
SADD user:567:interests "AI" "WebDev" "Cloud"
SISMEMBER user:567:interests "AI"
# 공동 관심사 추출 (교집합)
SINTER user:123:interests user:456:interests
# 추천 시스템 기반 차집합
SDIFF user:123:interests user:456:interests
Sorted Set — 점수 기반 정렬 집합
# 실시간 랭킹
ZADD leaderboard 872 "player_101" 945 "player_203" 761 "player_088"
ZRANGE leaderboard 0 4 WITHSCORES # 상위 5명
ZREVRANK leaderboard "player_203" # 역순 순위
ZPOPMAX leaderboard 3 # 최고 점수 3명 추출
공통 키 관리 명령어
KEYS user:* # 패턴 매칭 검색 (운영 환경에서는 주의)
EXISTS user:999 # 키 존재 여부
TYPE user:999 # 데이터 타입 확인
TTL user:999 # 남은 유효 시간 (초)
EXPIRE user:999 3600 # 재설정
RENAME user:999 user:1000 # 이름 변경
SELECT 2 # 데이터베이스 전환 (0~15)
FLUSHDB # 현재 DB 전체 삭제
실무 적용 사례
- 세션 저장소: 웹 애플리케이션의 세션 데이터를 분산 환경에서 공유
- 캐시 계층: DB 부하 완화를 위한 결과 캐싱 (예: API 응답, HTML 조각)
- 분산 락:
SET key value NX PX 10000로 배타적 자원 접근 제어 - 실시간 카운터: 페이지뷰, 좋아요 수, 조회수 등 고빈도 업데이트 지표
- 게임 리더보드: 점수 기반 순위 계산 및 실시간 갱신
- 지오스페이셜 검색:
GEOADD,GEORADIUS로 근처 장소 검색 - Pub/Sub 메시징: 이벤트 기반 아키텍처 구현 (예: 알림 시스템)
Python 연동 예시
import redis
# 연결 설정
client = redis.Redis(
host='localhost',
port=6379,
db=0,
decode_responses=True # 문자열 자동 디코딩 활성화
)
# String 연동
client.set("config:theme", "dark", ex=3600)
theme = client.get("config:theme")
# Hash 연동
client.hset("profile:456", mapping={"name": "Park Ji-Hoon", "city": "Seoul"})
profile = client.hgetall("profile:456")
# Sorted Set 연동
client.zadd("top_posts", {"post_123": 245, "post_456": 189})
top_three = client.zrevrange("top_posts", 0, 2, withscores=True)