드디어 Redis다
- 분산 캐시의 개념과 필요성
- 로컬 캐시(Local Cache)의 한계를 파악하고, 서버 확장 시 발생하는 문제
- 다중 서버 환경에서 데이터의 일관성이 왜 중요한가?
- 서버간 캐시 공유의 기본 원리를 이해하고, 확장성과 가용성 측면에서의 장점 익히기
- Redis와 같은 분산 캐시 시스템을 도입해야 하는 이유
분산 캐시의 필요성
분산 캐시는 여러 서버(노드)가 동일한 캐시 데이터를 공유할 수 있도록 네트워크를 통해 접근 가능한 캐시 저장소를 말함
로컬 캐시(Local Cache)와 달리 서버간 데이터 일관성(Consistency)을 유지할 수 있고, 확장성과 안정성이 뛰어남
1. 로컬 캐시의 한계
로컬 캐시는 각 서버의 메모리에 캐시를 저장하는 방식임
1) 문제점
- 서버마다 캐시가 서로 독립적으로 존재함
- 한 서버에서 데이터가 갱신되어도 다른 서버의 캐시는 오래된 데이터(Old Data)를 유지할 수 있음
- 서버가 재시작되면 캐시 데이터가 초기화되어, DB 부하가 일시적으로 급증하게 된다
import java.util.concurrent.ConcurrentHashMap;
public class test01 {
ConcurrentHashMap<String, Object> localCache = new ConcurrentHashMap<>();
public Object getData(String key) {
if(localCache.containsKey(key)) {
return localCache.get(key);
}
Object data = database.load(key); // db에서 조회하는 로직 예시
localCache.put(key, data);
return data;
}
}
* 단일 서버에서는 빠르지만, 분산 환경에서는 데이터 불일치 문제가 필연적으로 발생한다
2. 다중 서버 환경에서의 데이터 일관성 문제
분산 시스템에서는 여러 서버가 동시에 같은 데이터를 캐시하고 변경할 수 있음
데이터 일관성에 대한 문제들
| 항목 | 설명 |
| 데이터 불일치 | 한 서버의 캐시 업데이트가 다른 서버로 반영되지 않음 |
| 동시성 문제 | 여러 서버가 같은 키에 대해 동시에 다른 값을 캐시함 |
| 복구 지연 | 장애 복구시 캐시 초기화로 인한 DB 과부하 |
* 이러한 문제들을 해결하기 위해서버간 캐시 공유 구조가 필요하다
3. 서버간 캐시 공유 메커니즘
분산 캐시는 모든 서버가 공통 캐시 저장소(Shared Cache)에 접근하여 데이터를 읽고 저장한다
1) 장점
- 모든 서버가 동일한 캐시 데이터를 공유함
- 한 서버가 데이터를 변경하면 즉시 모든 서버에 반영된다
- 서버를 추가해도 캐시 일관성이 깨지지 않는다
// 분산 캐시의 예시(Redis, Memcached등 활용)
RedisTemplate<String, Object> redisTemplate;
public Object getData(String key) {
Object data = redisTemplate.opsForValue().get(key); // Redis
if(data != null) {
return data; // Redis 캐시를 조회함
}
data = dataBase.load(key); // DB를 조회함
redisTemplate.opsForValue().set(key, data, 10, TimeUnit.MINUTES); // Redis에도 저장함
return data;
}
* 모든 서버가 같은 캐시 저장소(Redis 등등..)를 바라보기 때문에, 데이터 일관성을 쉽게 유지할 수 있음
4. 확장성과 고가용성 요구사항
분산 캐시는 단순히 캐시 공유를 넘어, 확장성(Scalability)과 고가용성(High Availability)을 제공함
1) 확장성(Scalability)
- 서버 수가 증가하더라도, 캐시 데이터는 중앙에서 관리되므로 부하를 균등하게 분산할 수 있음
- Redis Cluster나 Sharding 기법을 통해 대규모 트래픽을 처리할 수 있음
2) 고가용성(High Availability)
- 분산 캐시는 마스터 - 슬레이브 구조를 통해 장애시에도 서비스 중단 없이 운영됨
- 장애 감지와 자동 복구(Failover)를 지원하고 있음
| 요소 | 역할 |
| Master | 데이터 저장 및 쓰기 처리 |
| Replica(Slave) | 읽기 요청 처리 및 복제 데이터 유지 |
| Sentinel | 장애감지 및 자동 Failover 수행 |
* 마스터 - 슬레이브와 같은 구조 덕에 캐시는 단순 속도 향상 수단이 아닌, 안정적 서비스 운영의 핵심 인프라가 된다고 함
실무 적용시 고려해야할 점
분산 캐시를 도입한다고 해서 모든 문제가 자동으로 해결되는건 아님
1. 네트워크 비용 고려
- 캐시 접근이 로컬 메모리가 아닌 네트워크를 거치기 때문에, 지연(Latency)이 발생할 수 있음
- 이를 완화하기 위해 로컬 캐시 + 분산 캐시 병행(Local + Distributed Hybrid) 구조를 자주 사용함
* 자주 사용되는 데이터는 로컬 캐시에 두고, 나머지를 Redis를 통해 접근하는 방식임
2. TTL 정책의 중요성
- 분산 캐시에도 TTL을 설정하지 않으면, 오래된 데이터가 계속 남아 데이터 불일치(Data Drift)를 초래할 수 있음
- 각 항목별 TTL을 비즈니스 요구사항에 맞게 세밀하게 조정해야함
3. 장애시 복구전략
- Redis 서버 장애시를 대비해 Replica 구성과 Persistence(RDB, AOF) 설정이 필요함
- 장애 발생시 자동 복구되도록 Sentinel 기반 모니터링을 구성해야함
팁
* 하이브리드 캐시 구조(Local + Distributed)는 성능과 일관성을 모두 잡을 수 있는 가장 일반적 방식이라고 함
* 트래픽이 폭증할 경우, 먼저 캐시 구조와 TTL 정책을 점검하는게 중요함
* 캐시 서버와 애플리케이션 서버는 같은 리전 / 가용영역(AZ)에 배치해서 네트워크 지연을 최소화함
* 운영 환경에서는 캐시 모니터링 시스템(Prometheus + Grafana)을 반드시 구성해야함
정리
| 항목 | 로컬 캐시 | 분산 캐시 |
| 데이터 저장 위치 | 서버 메모리 | 외부 캐시 서버(Redis 등등) |
| 데이터 일관성 | 서버별로 다름 | 서버간 공유 가능 |
| 확장성 | 낮음 | 높음(클러스터 구성 가능) |
| 고가용성 | 서버 장애시 손실됨 | 복제 및 Failover 지원 |
| 네트워크 비용 | 없음 | 있음(TCP 통신이 필요) |
'Spring Boot > Cache' 카테고리의 다른 글
| 분산 캐시의 이해와 Redis : 분산 캐시 활용 패턴 (0) | 2026.01.17 |
|---|---|
| 분산 캐시의 이해와 Redis : Redis 개요와 주요 특징 (0) | 2026.01.17 |
| 캐시 모니터링과 문제 해결 : 일반적 캐시 문제와 해결 방법 (0) | 2026.01.15 |
| 캐시 모니터링과 문제 해결 : 캐시 성능 분석 (0) | 2026.01.15 |
| 캐시 모니터링과 문제 해결 : Spring Boot Actuator를 활용한 모니터링 (0) | 2026.01.15 |