Redis 주니어 성능 최적화 면접

Redis 주니어 (1~3년) 성능 최적화 5문항 조회수 6 · 2026-09-19 (토) 12:11:14
1 메모리 최적화
Medium

Q. Redis 서버의 메모리 사용량이 지속적으로 증가하여 80%를 넘어섰습니다. 메모리 사용량을 분석하고 최적화하기 위해 확인해야 할 항목들과 각각의 확인 방법, 그리고 구체적인 개선 방안을 설명해주세요.

메모리를 가장 많이 차지하는 키 타입과 크기를 파악하고, 불필요한 데이터나 비효율적인 자료구조 사용을 찾아보세요.

A. 모범답안

먼저 INFO MEMORY 명령어로 전체 메모리 사용량과 메모리 할당 상태를 확인합니다. MEMORY STATS 명령으로 데이터 타입별 메모리 사용량을 분석하고, redis-cli --bigkeys 옵션으로 메모리를 많이 차지하는 큰 키들을 찾아냅니다. 개선 방안으로는 TTL이 설정되지 않은 키에 적절한 만료 시간을 설정하고, 큰 Hash나 List를 여러 개의 작은 키로 분할하며, ziplist 인코딩 임계값을 조정하여 메모리 효율적인 인코딩을 유지합니다. 또한 maxmemory-policy를 적절히 설정하여 메모리 한계 도달 시 자동으로 오래된 데이터를 삭제하도록 합니다.

핵심 포인트
  • • INFO MEMORY와 MEMORY STATS로 메모리 사용 현황 파악
  • • redis-cli --bigkeys로 메모리를 많이 차지하는 키 식별
  • • TTL 미설정 키에 만료 시간 설정 및 큰 키 분할
  • • ziplist 인코딩 활용과 maxmemory-policy 설정
답변에 넣으면 좋은 키워드
INFO MEMORY MEMORY STATS bigkeys TTL ziplist maxmemory-policy
실무에서는

운영 중인 캐시 서버의 메모리가 부족해질 때 병목 지점을 찾아 최적화하는 상황에서 사용됩니다.

Follow-up 질문

ziplist 인코딩이 hashtable 인코딩보다 메모리를 절약할 수 있는 이유는 무엇인가요?

2 네트워크 최적화
Medium

Q. Redis 서버와 애플리케이션 서버 간 네트워크 레이턴시가 평균 5ms입니다. 1000개의 키를 조회해야 하는 작업에서 각 키를 개별적으로 GET 명령어로 조회하면 성능상 어떤 문제가 발생하고, 이를 개선하기 위한 방법들을 설명해주세요.

네트워크 왕복 시간을 줄이는 방법과 여러 명령어를 효율적으로 실행하는 Redis 기능들을 생각해보세요.

A. 모범답안

개별 GET 명령어를 1000번 실행하면 각 요청마다 네트워크 왕복 시간(RTT)이 발생하여 최소 5000ms(5초)가 소요됩니다. 개선 방법으로는 첫째, MGET 명령어를 사용하여 한 번의 요청으로 여러 키를 조회하면 RTT를 1회로 줄일 수 있습니다. 둘째, Pipeline 기능을 사용하면 여러 명령어를 한 번에 전송하고 응답을 일괄 수신하여 네트워크 왕복 횟수를 대폭 줄입니다. 셋째, Connection Pool을 적절히 설정하여 연결 생성 오버헤드를 제거합니다. 특히 Pipeline을 사용하면 1000개 명령어를 100개씩 묶어 10번의 RTT로 줄일 수 있어 약 50ms로 단축됩니다.

핵심 포인트
  • • 개별 명령어 실행 시 RTT가 누적되어 성능 저하
  • • MGET으로 여러 키를 한 번에 조회하여 RTT 감소
  • • Pipeline으로 명령어를 배치 전송하여 네트워크 왕복 최소화
  • • Connection Pool로 연결 생성 오버헤드 제거
답변에 넣으면 좋은 키워드
RTT MGET Pipeline Connection Pool 네트워크 레이턴시 배치 처리
실무에서는

대량의 캐시 데이터를 조회할 때 네트워크 오버헤드를 줄여 응답 시간을 개선하는 상황에서 사용됩니다.

Follow-up 질문

Pipeline과 MULTI/EXEC의 차이점은 무엇이며, 언제 각각을 사용해야 하나요?

3 명령어 최적화
Medium

Q. 특정 prefix로 시작하는 모든 키를 찾아 삭제해야 하는 배치 작업을 구현해야 합니다. KEYS 패턴 매칭 명령어를 사용했더니 Redis 서버가 일시적으로 응답하지 않는 현상이 발생했습니다. 왜 이런 문제가 발생했는지 설명하고, 안전하게 구현하는 방법을 제시해주세요.

Redis의 싱글 스레드 특성과 KEYS 명령어의 시간 복잡도, 그리고 대안 명령어를 생각해보세요.

A. 모범답안

KEYS 명령어는 O(N) 시간 복잡도를 가지며 모든 키를 한 번에 스캔하므로 싱글 스레드인 Redis가 작업을 완료할 때까지 다른 모든 클라이언트 요청이 블로킹됩니다. 수백만 개의 키가 있는 경우 수 초간 서버가 멈출 수 있습니다. 안전한 구현 방법은 SCAN 명령어를 사용하는 것으로, SCAN은 커서 기반으로 소량씩 반복 조회하여 다른 요청을 처리할 시간을 확보합니다. 구체적으로 SCAN 0 MATCH prefix:* COUNT 100 형태로 100개씩 조회하고, 반환된 커서가 0이 될 때까지 반복하며 매칭된 키를 DEL 또는 UNLINK로 삭제합니다. UNLINK는 비동기 삭제로 더 안전합니다.

핵심 포인트
  • • KEYS 명령어는 O(N)으로 전체 키 스캔 시 서버 블로킹 발생
  • • 싱글 스레드 특성상 KEYS 실행 중 다른 요청 처리 불가
  • • SCAN 명령어로 커서 기반 반복 조회하여 블로킹 방지
  • • UNLINK로 비동기 삭제하여 성능 영향 최소화
답변에 넣으면 좋은 키워드
KEYS SCAN O(N) 블로킹 싱글 스레드 UNLINK 커서
실무에서는

운영 중인 Redis에서 오래된 캐시 키를 정리하거나 특정 패턴의 키를 삭제할 때 서비스 중단 없이 안전하게 처리하는 상황에서 사용됩니다.

Follow-up 질문

SCAN 명령어 사용 시 같은 키가 중복으로 반환될 수 있는데, 이를 어떻게 처리해야 하나요?

4 자료구조 선택 최적화
Medium

Q. 사용자별 알림 목록을 관리하는데, 각 사용자당 평균 10개 미만의 알림이 있고 알림은 시간순으로 정렬되어야 하며 개별 알림의 읽음 상태를 업데이트해야 합니다. List, Sorted Set, Hash 중 어떤 자료구조를 선택하는 것이 성능상 유리한지 각각의 장단점을 비교하여 설명해주세요.

각 자료구조에서 정렬 유지, 개별 항목 업데이트, 범위 조회의 시간 복잡도를 비교해보세요.

A. 모범답안

List는 시간순 추가(LPUSH)는 O(1)로 빠르지만 중간 항목의 읽음 상태 업데이트가 어렵고 LINDEX로 접근 시 O(N)입니다. Sorted Set은 타임스탬프를 score로 사용하면 정렬이 자동 유지되고 ZRANGE로 범위 조회가 O(log N + M)으로 효율적이지만, 읽음 상태 같은 추가 속성을 저장할 수 없어 별도 Hash가 필요합니다. Hash는 알림 ID를 field로 사용하면 개별 알림 업데이트가 O(1)로 매우 빠르지만 정렬 기능이 없어 애플리케이션에서 정렬해야 합니다. 알림 개수가 10개 미만으로 적고 개별 업데이트가 빈번하다면 Hash에 JSON 형태로 저장하고 애플리케이션에서 정렬하는 것이 가장 실용적이며, 또는 Sorted Set으로 순서를 관리하고 Hash로 상세 정보를 저장하는 조합도 고려할 수 있습니다.

핵심 포인트
  • • List는 순서 유지는 쉽지만 중간 항목 업데이트가 비효율적
  • • Sorted Set은 자동 정렬되지만 추가 속성 저장 불가
  • • Hash는 개별 업데이트가 O(1)로 빠르지만 정렬 기능 없음
  • • 데이터 크기가 작으면 Hash + 애플리케이션 정렬이 실용적
답변에 넣으면 좋은 키워드
List Sorted Set Hash 시간 복잡도 LPUSH ZRANGE HSET
실무에서는

모바일 앱의 푸시 알림 목록이나 활동 피드를 관리할 때 조회와 업데이트 성능을 모두 고려해야 하는 상황에서 사용됩니다.

Follow-up 질문

알림 개수가 수천 개로 증가한다면 어떤 자료구조와 설계 방식이 더 적합할까요?

5 캐시 전략 최적화
Hard

Q. 상품 상세 페이지 API가 데이터베이스 조회로 인해 응답 시간이 평균 200ms입니다. Redis 캐싱을 도입하여 50ms 이내로 개선하려고 합니다. Cache Stampede 문제가 무엇인지 설명하고, 인기 상품의 캐시가 만료되는 순간 동시에 수천 개의 요청이 들어올 때 데이터베이스 과부하를 방지하는 구현 방법을 제시해주세요.

캐시 만료 시점에 여러 요청이 동시에 DB를 조회하는 문제와 이를 방지하기 위한 락 메커니즘을 생각해보세요.

A. 모범답안

Cache Stampede는 인기 있는 캐시 키가 만료되는 순간 동시 다발적인 요청들이 모두 캐시 미스를 경험하고 데이터베이스를 동시에 조회하여 과부하를 일으키는 현상입니다. 방지 방법으로는 첫째, 캐시 조회 시 값이 없으면 SETNX로 임시 락 키를 생성하고 락을 획득한 요청만 DB를 조회하며 나머지는 짧은 대기 후 재시도합니다. 둘째, Probabilistic Early Expiration 방식으로 TTL이 얼마 남지 않았을 때 확률적으로 미리 갱신합니다. 셋째, 캐시에 빈 값이나 stale 데이터를 저장하고 백그라운드에서 비동기로 갱신하는 방식을 사용합니다. 넷째, TTL에 랜덤 시간을 추가하여 만료 시점을 분산시킵니다. 실무에서는 SETNX 락과 TTL 랜덤화를 조합하여 사용하는 것이 효과적입니다.

핵심 포인트
  • • Cache Stampede는 캐시 만료 시 동시 DB 조회로 과부하 발생
  • • SETNX로 락을 구현하여 한 요청만 DB 조회하도록 제어
  • • Probabilistic Early Expiration으로 만료 전 미리 갱신
  • • TTL 랜덤화로 만료 시점 분산 및 비동기 갱신 활용
답변에 넣으면 좋은 키워드
Cache Stampede SETNX 락 TTL Probabilistic Early Expiration 비동기 갱신
실무에서는

쇼핑몰의 인기 상품이나 이벤트 페이지처럼 트래픽이 집중되는 데이터의 캐시가 만료될 때 데이터베이스를 보호하는 상황에서 사용됩니다.

Follow-up 질문

SETNX로 락을 구현할 때 락을 획득한 프로세스가 중간에 죽으면 어떤 문제가 발생하고 어떻게 해결해야 하나요?

댓글 0

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

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