← 모든 글

Redis 를 캐시로만 쓰지 않는 6가지 패턴

Redis를 단순 캐시 레이어로만 활용하는 데 그치지 않고, 우리 팀이 실제로 적용해본 6가지 활용 패턴을 정리했다.

Redis를 처음 도입하는 팀은 대부분 캐시 목적으로 쓴다. DB 조회 결과를 Redis에 저장하고, 다음 요청에서 DB를 거치지 않는 패턴이다. 유용하지만 Redis가 할 수 있는 일의 일부다. 우리 팀이 실제로 써본 패턴을 여섯 가지로 정리했다.

1. 분산 락

여러 서버 인스턴스가 같은 작업을 동시에 실행하지 못하도록 막아야 할 때 Redis의 SET NX(Not eXists) 옵션을 활용한다. 락을 잡은 인스턴스만 작업을 수행하고, 나머지는 락이 풀릴 때까지 대기하거나 스킵한다.

만료 시간을 함께 설정해서 락을 잡은 프로세스가 비정상 종료되더라도 락이 영구히 유지되지 않도록 한다. 단순하지만 배치 작업 중복 실행 방지에 효과적으로 쓴다.

2. 실시간 순위표

Sorted Set은 점수 기반으로 정렬된 집합을 관리한다. 사용자 점수나 활동 지표를 Sorted Set에 저장하면 상위 N개를 조회하거나 특정 사용자의 순위를 가져오는 것이 O(log N)으로 가능하다. DB에서 ORDER BY + LIMIT 쿼리를 반복 실행하는 것보다 빠르고, 읽기 부하를 줄일 수 있다.

3. 속도 제한(Rate Limiting)

특정 사용자나 IP가 단위 시간 내에 요청을 너무 많이 보내지 못하도록 제한할 때 Redis의 INCR과 EXPIRE를 조합한다. 키가 없으면 1로 시작하고, 만료 시간을 설정해서 시간 창을 만든다. 카운터가 임계치를 넘으면 요청을 거부한다.

슬라이딩 윈도우 방식이 필요하면 Sorted Set으로 타임스탬프를 관리하는 방식도 쓴다.

4. Pub/Sub 메시지 채널

Redis의 Pub/Sub 기능으로 서버 간 간단한 메시지 전달을 구현할 수 있다. 설정 변경 알림, 세션 무효화 브로드캐스트 등 복잡한 메시지 큐가 필요 없는 상황에 적합하다.

단, Redis Pub/Sub은 메시지 보장이 없다. 구독자가 없거나 연결이 끊긴 상태에서 발행된 메시지는 유실된다. 메시지 유실이 허용되지 않는 상황에서는 Redis Streams나 다른 메시지 브로커를 검토해야 한다.

5. 임시 토큰 저장소

이메일 인증 코드, 비밀번호 재설정 링크, 단기 세션 토큰처럼 유효 시간이 있는 데이터를 저장할 때 Redis의 TTL 기능이 편리하다. DB에 넣고 만료 처리를 별도로 구현하는 것보다 훨씬 단순하다.

토큰을 한 번 사용하면 즉시 삭제하는 패턴도 GETDEL 명령 하나로 처리된다.

6. 카운터와 통계

페이지 조회 수, 좋아요 수, 다운로드 수처럼 빠르게 증가하는 카운터를 Redis에서 관리하고, 주기적으로 DB에 플러시하는 패턴이다. 매 요청마다 DB를 업데이트하는 것보다 훨씬 적은 부하로 통계를 유지할 수 있다.

단, Redis 재시작 시 데이터가 유실될 수 있으므로 AOF 또는 RDB 지속성 설정을 확인해야 한다.

이 여섯 가지 패턴이 Redis의 전부는 아니다. 다만 캐시 하나만 쓰고 있다면, 나머지 기능을 살펴볼 가치가 있다.

— by slecs