일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- BFS
- web
- 브루트포스 알고리즘
- CSS
- level2
- 그리디 알고리즘
- DFS
- 파이썬
- 너비 우선 탐색
- 구현
- lv2
- 문자열
- 백준
- 다이나믹 프로그래밍
- 딕셔너리
- 자료구조
- 정렬
- 그래프 이론
- 프로그래머스스쿨
- 알고리즘
- BASIC
- 그래프 탐색
- DP
- 자바스크립트
- 웹 프론트엔드
- JavaScript
- 프로그래머스
- 스택
- 그래프이론
- programmers
- Today
- Total
DevLog:-)
[Redis #1] 입문부터 실전까지: 인메모리 데이터베이스의 핵심 이해 본문
1. 들어가며
Redis는 대표적인 In-Memory Key-Value 저장소입니다. 빠른 속도와 다양한 데이터 구조를 제공하며, 실시간 데이터 처리, 인증 시스템, 캐싱, 세션 저장 등 다양한 분야에서 활발히 사용됩니다. 이 글에서는 Redis의 핵심 개념부터 실무에 적용하기 위한 실전 예제, 성능 고려사항, 확장 도구까지 체계적으로 정리합니다.
2. In-Memory Database란?
In-Memory Database는 데이터를 디스크가 아닌 메모리(RAM)에 저장하는 방식의 데이터베이스입니다. 전통적인 RDBMS보다 훨씬 빠른 속도를 제공하지만, 메모리 기반이라는 특성상 운영 시 몇 가지 주의가 필요합니다.
장점
- 낮은 지연 시간(Latency), 빠른 응답 속도
- 비동기 처리에 적합하며 TPS가 높은 시스템에 적합
- 간단한 구조와 빠른 학습 곡선
단점
- 데이터 휘발성 → 별도의 영속성 설정 필요 (RDB, AOF)
- 메모리 용량에 따라 저장 한계 존재
- 복잡한 쿼리 기능 부족
Redis vs. 다른 In-Memory DB
항목Redis/MemcachedEhcache / Hazelcast
구조 | Key-Value + 다양한 구조체 | 단순 Key-Value | JVM 기반 객체 저장 |
데이터 타입 | String, Hash, List, Set, ZSet 등 | String only | Java 객체 중심 캐시 |
영속성 | RDB, AOF 지원 | 미지원 | 지원 (옵션에 따라 상이) |
스레드 | 단일 스레드(Event loop 기반) | 멀티 스레드 | 멀티 스레드 |
주요 활용 | 캐시, 세션, 인증, 랭킹, 메시지큐 | 캐시 중심 | 분산 캐시, 복제 클러스터 |
3. Redis 데이터 타입
Redis는 단순한 Key-Value 저장소를 넘어, 다양한 구조의 데이터를 저장하고 처리할 수 있는 구조를 제공합니다.
주요 데이터 타입
- String: 기본 Key-Value 구조
- Hash: 필드-값 쌍 저장. JSON과 유사한 구조
- List: FIFO 큐 형태, 채팅 메시지, 알림 등에 활용
- Set: 중복 없는 집합 구조
- Sorted Set (ZSet): 점수 기반 정렬. 랭킹 시스템 구현에 최적
- Bitmap / HyperLogLog / Stream: 특수한 목적 (통계, 실시간 처리 등)
4. Redis 설치 및 명령어
Docker로 Redis 실행하기
docker run --name redis -p 6379:6379 -d redis
기본 명령어
SET user:1:name "Alice"
GET user:1:name
HSET user:1 profile "developer"
LPUSH queue "message"
SADD tags "redis" "spring"
ZADD rank 100 "user1"
실시간 모니터링
redis-cli MONITOR
디버깅용으로만 사용. 실 운영 환경에서는 사용 금지 (부하 유발)
5. Spring Boot에서 Redis 활용
의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
설정 예시
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
간단한 사용 예
redisTemplate.opsForValue().set("session:user:1", "active", 10, TimeUnit.MINUTES);
String status = redisTemplate.opsForValue().get("session:user:1");
6. 실무에서 반드시 알아야 할 고급 개념과 주의사항
시간 복잡도
- 대부분 명령은 O(1) 또는 O(logN)
- KEYS *, FLUSHALL 등의 명령은 O(N) 이상 → 운영 환경에서 절대 사용 금지
- 대체: SCAN, SSCAN, ZSCAN, HSCAN
트랜잭션 (MULTI / EXEC)
- MULTI로 명령 큐잉 → EXEC으로 원자성 있게 실행
- 중간 오류 발생 시 전체 롤백 불가 → 주의 필요
TTL (Time To Live)
- key별로 만료 시간 설정 가능
- 만료되지 않으면 영구 저장됨 → 캐시 누수 주의
메모리 관리 정책 (Eviction Policy)
- 설정 예: maxmemory-policy allkeys-lru
- 지원 정책: noeviction, volatile-lru, allkeys-lru, allkeys-random, volatile-ttl 등
고가용성 / 확장
- Redis Sentinel: 마스터 장애 감지 및 자동 failover
- Redis Cluster: 샤딩 기반 수평 확장, 분산 환경에 적합
7. 함께 사용하면 좋은 도구들
도구 | 설명 |
RedisInsight | Redis Labs 제공 공식 GUI 클라이언트 |
Redisson | 분산락, 캐시, 비동기 지원 등 고급 기능 포함 |
Spring Cache | Redis와 연동되는 Spring 추상 캐시 애노테이션 |
Lettuce | 비동기/논블로킹 지원 클라이언트 |
Prometheus + Grafana | Redis 성능 모니터링 및 시각화 대시보드 구성을 위한 조합 |
8. 마무리: Redis는 캐시 그 이상이다
Redis는 단순한 캐시 서버 이상의 역할을 합니다. 빠른 응답 속도, 구조화된 데이터 저장, 다양한 실시간 기능 덕분에 현대적인 백엔드 시스템의 필수 요소로 자리잡았습니다.
그러나 무조건 빠르다고 모든 것을 Redis에 넣어서는 안 됩니다. 데이터 영속성, 메모리 용량, TTL 관리, 명령어 시간 복잡도 등 Redis의 특성과 운영 이슈를 충분히 이해한 후 사용하는 것이 중요합니다.
다음 글에서는 JWT 인증 시스템에서 Redis를 활용하여 refresh token을 화이트리스트 방식으로 관리한 실전 구현 사례를 소개합니다. 실전 코드와 함께 Redis의 장점을 어떻게 보안 아키텍처에 녹여내 보았습니다.