Redis 주니어 시스템 설계 면접

Redis 주니어 (1~3년) 시스템 설계 5문항 조회수 110 · 2026-05-17 (일) 19:10:52
1 Redis 클러스터링
Medium

Q. 트래픽이 증가하면서 단일 Redis 인스턴스로는 처리량이 부족한 상황입니다. Redis Cluster와 Redis Sentinel의 차이점을 설명하고, 각각 어떤 문제를 해결하기 위해 사용하는지 말씀해주세요.

A. 모범답안

Redis Sentinel은 고가용성(HA)을 위한 솔루션으로, 마스터 노드 장애 시 자동으로 슬레이브를 마스터로 승격시키는 자동 페일오버 기능을 제공합니다. Redis Cluster는 데이터를 여러 노드에 분산 저장하여 수평 확장(Scale-out)을 가능하게 하며, 16384개의 해시 슬롯을 사용해 키를 자동으로 샤딩합니다. Sentinel은 가용성 문제를, Cluster는 용량과 처리량 문제를 해결합니다. 실무에서는 두 가지를 함께 사용하여 고가용성과 확장성을 동시에 확보하기도 합니다.

핵심 포인트
  • • Sentinel은 고가용성과 자동 페일오버를 제공
  • • Cluster는 데이터 샤딩을 통한 수평 확장 지원
  • • Sentinel은 가용성, Cluster는 확장성 문제 해결
  • • 해시 슬롯 기반 데이터 분산
Follow-up 질문

Redis Cluster에서 특정 키가 어느 노드에 저장되는지 결정하는 해시 슬롯 방식에 대해 좀 더 자세히 설명해주실 수 있나요?

2 API Rate Limiting
Medium

Q. API 서버에서 사용자별로 분당 100회 요청 제한을 구현해야 합니다. Redis를 활용한 Rate Limiting 시스템을 설계할 때 어떤 데이터 타입과 명령어를 사용할 수 있는지, 그리고 구현 방식을 설명해주세요.

A. 모범답안

가장 간단한 방법은 String 타입과 INCR, EXPIRE 명령어를 사용하는 것입니다. 키를 'rate_limit:user_id:분단위_타임스탬프' 형식으로 만들고, 요청마다 INCR로 카운트를 증가시키며, 첫 요청 시 EXPIRE로 60초 TTL을 설정합니다. 더 정교한 방법으로는 Sorted Set을 사용해 타임스탬프를 score로 저장하고, ZREMRANGEBYSCORE로 1분 이전 데이터를 삭제한 후 ZCARD로 현재 카운트를 확인하는 Sliding Window 방식이 있습니다. 이 방식은 분 경계에서 발생하는 버스트 트래픽 문제를 해결할 수 있습니다.

핵심 포인트
  • • String 타입과 INCR/EXPIRE를 사용한 Fixed Window 방식
  • • Sorted Set을 활용한 Sliding Window 방식으로 정교한 제어
  • • 키 설계 시 사용자 ID와 시간 정보 포함
  • • TTL 설정으로 자동 메모리 관리
Follow-up 질문

Fixed Window 방식과 Sliding Window 방식의 장단점을 비교하고, 실무에서 어떤 기준으로 선택해야 할까요?

3 분산 락
Hard

Q. 여러 서버에서 동시에 동일한 상품의 재고를 차감하는 상황에서 동시성 문제가 발생할 수 있습니다. Redis를 사용하여 분산 락(Distributed Lock)을 구현할 때 고려해야 할 사항과 SETNX 명령어를 활용한 기본 구현 방식을 설명해주세요.

A. 모범답안

분산 락 구현 시 SETNX(SET if Not eXists)와 EXPIRE를 원자적으로 실행하기 위해 SET 명령어의 NX와 EX 옵션을 함께 사용해야 합니다. 예를 들어 'SET lock:product:123 unique_value NX EX 10' 형태로 락을 획득하며, 락 해제 시에는 자신이 설정한 값인지 확인 후 삭제해야 합니다. 고려사항으로는 락 타임아웃 설정(데드락 방지), 고유한 락 식별자 사용(다른 프로세스의 락 해제 방지), 락 획득 실패 시 재시도 로직, 그리고 프로세스가 비정상 종료되어도 락이 자동 해제되도록 TTL 설정이 필요합니다. 더 안정적인 구현을 위해서는 Redlock 알고리즘이나 Redisson 같은 라이브러리 사용을 고려할 수 있습니다.

핵심 포인트
  • • SET NX EX를 사용한 원자적 락 획득
  • • 고유한 값으로 락 소유권 확인
  • • TTL 설정으로 데드락 방지
  • • 락 해제 시 소유권 검증 필수
Follow-up 질문

Redis 인스턴스가 다운되면 분산 락이 실패할 수 있습니다. 이를 해결하기 위한 Redlock 알고리즘의 기본 원리에 대해 설명해주실 수 있나요?

4 실시간 리더보드
Medium

Q. 게임 서비스에서 실시간으로 업데이트되는 사용자 점수 순위표(리더보드)를 구현해야 합니다. 수백만 명의 사용자 점수를 관리하고 상위 100명을 빠르게 조회해야 할 때, Redis의 어떤 데이터 타입과 명령어를 사용하면 효율적인지 설계해주세요.

A. 모범답안

Sorted Set 데이터 타입이 리더보드 구현에 최적입니다. ZADD 명령어로 사용자 ID를 멤버로, 점수를 score로 저장하며, 점수 업데이트도 동일한 명령어로 처리됩니다. 상위 100명 조회는 ZREVRANGE 명령어를 사용하고, 특정 사용자의 순위는 ZREVRANK로 O(log N) 시간복잡도로 조회 가능합니다. 점수가 같을 경우 사전순 정렬을 위해 멤버 이름을 조정하거나, 시간 정보를 점수에 포함시킬 수 있습니다. Sorted Set은 내부적으로 Skip List와 Hash Table을 함께 사용하여 빠른 삽입, 삭제, 범위 조회를 지원합니다.

핵심 포인트
  • • Sorted Set을 사용한 자동 정렬 기능 활용
  • • ZADD로 점수 저장/업데이트, ZREVRANGE로 상위 N명 조회
  • • ZREVRANK로 특정 사용자 순위 조회
  • • O(log N) 시간복잡도로 효율적인 성능
Follow-up 질문

월간 리더보드, 주간 리더보드처럼 여러 기간별 순위표를 동시에 관리해야 한다면 키 설계를 어떻게 하시겠습니까?

5 캐시 전략
Medium

Q. 전자상거래 사이트에서 상품 상세 정보를 캐싱할 때, 상품 정보가 업데이트되면 즉시 캐시에 반영되어야 합니다. Write Behind 패턴과 Write Invalidation 패턴의 차이를 설명하고, 각각의 장단점을 비교해주세요.

A. 모범답안

Write Behind(Write Back) 패턴은 데이터를 먼저 캐시에 쓰고 비동기적으로 DB에 반영하는 방식으로, 쓰기 성능이 뛰어나지만 캐시 장애 시 데이터 유실 위험이 있습니다. Write Invalidation 패턴은 데이터 업데이트 시 캐시를 삭제만 하고, 다음 읽기 요청 시 DB에서 새로 조회하여 캐시에 저장하는 방식입니다. Write Invalidation은 구현이 간단하고 데이터 정합성이 보장되지만, 캐시 미스가 발생하여 첫 요청이 느릴 수 있습니다. 전자상거래처럼 데이터 정합성이 중요한 경우 Write Invalidation이 더 안전하며, 필요시 Cache Aside 패턴과 함께 사용하여 읽기 성능을 최적화할 수 있습니다.

핵심 포인트
  • • Write Behind는 캐시 우선 쓰기 후 비동기 DB 반영
  • • Write Invalidation은 업데이트 시 캐시 삭제
  • • Write Behind는 성능 우수하나 데이터 유실 위험
  • • Write Invalidation은 정합성 보장하나 캐시 미스 발생
Follow-up 질문

상품 정보 업데이트 빈도가 매우 높아서 캐시 삭제가 빈번하게 발생한다면, 성능을 개선하기 위해 어떤 전략을 추가로 적용할 수 있을까요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!