✅ Redis란?
Redis는 데이터 저장과 캐싱에 모두 강력한 기능을 제공하는 초고속 인메모리 데이터 저장소이다.
REmote DIctionary Server의 줄임말
- RAM(메모리) 에 데이터를 저장해서 매우 빠른 속도를 자랑한다.
- 기본적으로는 Key-Value 구조지만, 다양한 자료구조도 지원한다.
- 오픈소스이며, 많은 시스템에서 캐시, 세션 저장소, 메시지 큐 등으로 사용되고 있다.
✅ 주요 특징
| 특징 | 설명 |
|---|
| 🔥 초고속 처리 속도 | 모든 데이터가 메모리에 있으므로 디스크보다 훨씬 빠름 |
| 🔑 Key-Value 저장 방식 | 문자열, 리스트, 해시, 집합, 정렬된 집합 등 다양한 자료형 지원 |
| 🧠 캐시 용도 최적화 | TTL(Time To Live) 설정 가능 → 자동 만료 가능 |
| 💾 Persistence 지원 | 메모리에 있지만 디스크에도 주기적으로 저장 가능 (옵션) |
| 📡 분산 시스템 지원 | Redis Cluster, Replication 등 고가용성 아키텍처 가능 |
| 📨 Pub/Sub 기능 | 메시지 브로커로도 사용 가능 |
✅ Redis는 어디에 쓰이나?
| 사용 사례 | 설명 |
|---|
| ✅ 캐시 | DB 대신 자주 쓰는 데이터를 Redis에 저장하여 빠르게 제공 |
| ✅ 세션 저장소 | 사용자 로그인 세션 같은 상태 정보 저장 |
| ✅ 순위표/좋아요 수 | 빠른 증가 연산/정렬이 필요한 기능에 적합 |
| ✅ 메시지 큐 | pub/sub, 스트림 처리 등 실시간 알림용으로 활용 |
| ✅ 분산락 | 여러 서버 간 자원 충돌을 막기 위해 사용 |
✅ Redis vs 일반 DB
| 항목 | Redis | 관계형 DB |
|---|
| 속도 | 매우 빠름 (메모리 기반) | 상대적으로 느림 (디스크 기반) |
| 저장방식 | Key-Value (비정형) | Table/Column (정형) |
| 주요 용도 | 캐시, 세션, 큐 | 트랜잭션, 정형 데이터 저장 |
| 영속성 | 선택 가능 (RDB, AOF) | 기본적으로 영속적 |
✔️ 예시
> SET title "Redis is awesome"
OK
> GET title
"Redis is awesome"
✅ Redis를 Spring에서 쓰는 대표적인 방식
- @Cacheable + Redis → API 응답 캐싱
- @SessionAttributes + Redis → 로그인 세션 유지
- RedisTemplate/ReactiveRedisTemplate → Redis 데이터 직접 제어
✅ 요약
| 항목 | 내용 |
|---|
| 정의 | 인메모리 기반 초고속 Key-Value 저장소 |
| 주요 용도 | 캐시, 세션, 실시간 데이터 처리 |
| 장점 | 빠름, TTL, 다양한 자료형, 분산 시스템 가능 |
| 단점 | 메모리 기반 → 비용/용량 제한 가능성 있음 |
✅ 1. Spring Boot + Redis 설정 예제
✔️ 1.1 의존성 추가 (build.gradle)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-cache'
}
✔️ 1.2 Redis 설정 (RedisConfig.java)
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory("localhost", 6379);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10))
.disableCachingNullValues();
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.build();
}
}
✔️ 1.3 사용 예
@Service
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
@Cacheable(value = "searchPosts", key = "#title")
public Page<Post> searchPosts(String title, Pageable pageable) {
return postRepository.findAllByTitleContaining(title, pageable);
}
}
✅ 2. Redis vs Caffeine 비교
| 항목 | Redis | Caffeine |
|---|
| 저장 위치 | 외부 서버 (네트워크 기반) | 애플리케이션 JVM 내부 (메모리 기반) |
| 속도 | 빠름 (하지만 네트워크 오버헤드 존재) | 매우 빠름 (로컬 메모리 접근) |
| 확장성 | 분산 캐시 가능 (멀티 인스턴스 공유 가능) | 불가능 (인스턴스 로컬 캐시만 가능) |
| 캐시 크기 | 메모리 제한 없음 (서버가 감당 가능한 한) | JVM 힙 사이즈에 의존 |
| 복잡도 | 설정/운영이 상대적으로 복잡 | 설정 간단, 코드만으로 가능 |
| 적합한 경우 | 사용자 수가 많고 인스턴스가 여러 개인 대규모 서비스 | 단일 인스턴스나 소규모 트래픽 환경 |
| TTL, 만료 정책 | 설정 가능 (TTL, LRU 등) | 매우 정교한 정책 제공 (LFU, LRU 등) |
| 추가 기능 | pub/sub, persistence 등 | 단순 캐시 기능만 제공 |
✔️ 어떤 걸 선택해야 할까?
-
Caffeine 추천
- 트래픽이 낮거나, 단일 서버로 운영되는 서비스
- 매우 빠른 속도가 필요한 경우
-
Redis 추천
- 여러 서버에서 캐시를 공유해야 하는 경우 (멀티 인스턴스)
- 세션 저장, 메시지 큐 등 다양한 기능이 필요한 경우
Redis까지!! 아주 든든합니다