Redis 기초부터 실무까지: 키-값 저장소의 핵심 개념과 활용

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 1RDB 자동 저장 조건 (900초 내 1개 변경 시)필요에 따라 조정
appendonly yesAOF 영속성 활성화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)

태그: Redis NoSQL key-value Database Caching

10월 8일 12:08에 게시됨