
— 실무에서 자주 쓰는 3가지 패턴 정리
실무에서 Redis를 왜 쓰냐고 묻는다면?
대부분은 캐시 때문이라고 말하겠지만,
사실 Redis는 그 이상으로 다양하게 활용된다.이 글은 내가 Redis를 공부하면서 정리한 내용을 바탕으로,
실무에서 자주 쓰이는 Redis의 3가지 대표 사용 패턴을 정리한 기록이다.
Redis는 인메모리 기반의 NoSQL 데이터 저장소다.
단순히 "빠르다"는 이유만으로 쓰이지는 않는다.
실제로는 다음과 같은 이유로 선택된다:
로그인 상태를 유지해야 하는 경우,
세션 데이터를 Redis에 저장해 여러 서버 간 공유한다.
Spring 환경에서는 spring-session-data-redis를 통해
내장 세션 저장소를 Redis로 대체할 수 있다.
# application.yml 예시
spring:
session:
store-type: redis
redis:
host: localhost
port: 6379
✅ JWT와는 달리 서버 상태 기반 인증이므로, 세션 만료/폐기도 용이하다.
가장 대표적인 사용 사례.
자주 조회되는 데이터를 Redis에 저장하고,
DB 쿼리 횟수를 줄여 성능을 개선한다.
Spring에서는 @Cacheable, @CacheEvict 등의 애노테이션으로 간단히 적용 가능하다.
@Cacheable(value = "product", key = "#id")
public Product getProductById(Long id) {
return productRepository.findById(id).orElseThrow();
}
해결 방법:
@CachePut또는@CacheEvict로 갱신/삭제 처리하거나,
복잡한 경우엔Cache-Aside,Write-Through전략으로 설계 필요.
access마다 TTL을 갱신할지(expireAfterAccess),expireAfterWrite) 선택 필요동시성 이슈가 발생하는 상황(예: 재고 차감, 중복 결제)에선
Redis의 락 기능을 활용한 분산 제어가 유용하다.
가장 기본적인 방식은 SETNX를 이용한 락 구현이다.
SET lock_key unique_token NX PX 3000
혹은 Redisson 라이브러리를 활용하면 더 안정적인 락을 쉽게 구현할 수 있다:
RLock lock = redissonClient.getLock("lock:order:" + orderId);
try {
boolean available = lock.tryLock(3, 5, TimeUnit.SECONDS);
if (!available) throw new IllegalStateException("Lock 실패");
// 처리 로직
} finally {
lock.unlock();
}
직접 구현한 경우, 락을 잡은 주체만 해제해야 한다.
그렇지 않으면 다른 사용자의 락을 잘못 해제해 데이터 정합성이 깨질 수 있다.
Redisson은 내부적으로 락 소유자 확인 로직이 포함되어 있어 안전하다.
| 상황 | Redis 적합 여부 |
|---|---|
| DB에 부하가 크고 자주 같은 데이터를 조회함 | ✅ 캐시로 적합 |
| 로그인 서버를 여러 개 두고 세션을 공유해야 함 | ✅ 세션 저장소로 적합 |
| 동시에 동일 자원 접근 시 충돌 우려가 있음 | ✅ 분산락 활용 |
| 트랜잭션 정합성이 가장 중요함 | ❌ 관계형 DB가 우선 |
| 실시간 로그 분석, 랭킹, 알림 큐 등이 필요함 | ✅ Redis 특화 구조 가능 |
Redis는 단순한 캐시 저장소를 넘어
세션 관리, 분산 처리, 간단한 큐, TTL 기반 데이터 관리 등
다양한 방식으로 실무에 활용되고 있다.
이번 글에서는 그중에서도 면접이나 과제에서 자주 언급되는 실전 패턴 3가지를 정리했다:
단순히 Redis를 사용하는 법이 아니라,
“왜 Redis를 선택하는가”에 스스로 설명할 수 있는 개발자가 되기!!!