고급 Redis 기능 및 데이터 구조
Redis Streams 와 주요 사용 사례를 설명해주세요.
답변:
Redis Streams 는 높은 처리량과 낮은 지연 시간으로 메시지 로깅 및 소비를 가능하게 하는 추가 전용 (append-only) 데이터 구조입니다. 이벤트 소싱, 실시간 데이터 파이프라인 및 메시지 순서와 기록이 중요한 메시지 큐를 구현하는 데 이상적이며, 소비자 그룹을 지원하여 병렬 처리가 가능합니다.
Redis 모듈이란 무엇인가요? 해결할 수 있는 문제의 예시를 들어주세요.
답변:
Redis 모듈은 C, C++ 또는 Rust 로 작성된 새로운 명령어와 데이터 타입을 추가할 수 있도록 하여 Redis 의 기능을 확장합니다. 예를 들어, RedisGraph (모듈) 는 그래프 데이터베이스 기능을 추가하여 복잡한 그래프 쿼리를 Redis 내에서 직접 실행할 수 있게 해주며, 이는 소셜 네트워크나 추천 엔진에 유용합니다.
Redis HyperLogLog 의 목적을 설명해주세요. 언제 사용해야 하나요?
답변:
Redis HyperLogLog (HLL) 는 매우 적은 메모리 사용량으로 집합의 카디널리티 (고유 요소의 수) 를 추정하는 데 사용되는 확률적 데이터 구조입니다. 웹사이트의 고유 방문자 수, 고유 검색 쿼리 또는 개별 IP 주소 수를 세는 것과 같이 정확한 개수가 필요하지 않지만 메모리 효율성이 중요한 시나리오에 적합합니다.
Redis Sorted Set 은 일반 Set 과 어떻게 다르며, 일반적인 응용 분야는 무엇인가요?
답변:
Redis Sorted Set 은 각 멤버가 점수 (score) 와 연관되어 있어 순서를 유지할 수 있는 고유한 문자열 (멤버) 의 컬렉션입니다. 일반 Set 과 달리 순서를 유지하며 점수 또는 사전순 순서에 기반한 범위 쿼리를 허용합니다. 일반적인 응용 분야로는 리더보드, 속도 제한기 및 요소를 순위별로 지정해야 하는 실시간 분석 등이 있습니다.
Redis 트랜잭션 (MULTI/EXEC) 을 설명해주세요. 제한 사항은 무엇인가요?
답변:
Redis 트랜잭션은 여러 명령어 그룹을 단일 원자적 작업으로 실행할 수 있도록 합니다. 명령어는 MULTI 이후에 큐에 추가되고 EXEC 에 의해 순차적으로 실행됩니다. 제한 사항은 ACID 의미에서 진정한 트랜잭션을 지원하지 않는다는 것입니다. 트랜잭션 내 오류에 대한 롤백은 지원하지 않으며, 구문 오류 또는 클라이언트 연결 끊김 시에만 롤백이 가능합니다.
Redis Lua 스크립팅이란 무엇인가요? 왜 유익한가요?
답변:
Redis Lua 스크립팅을 통해 개발자는 Lua 스크립트를 사용하여 Redis 서버에서 복잡하고 원자적인 작업을 실행할 수 있습니다. 이는 네트워크 왕복 횟수를 줄이고, 원자성 (스크립트 내의 모든 명령어가 하나의 단위로 실행됨) 을 보장하며, 단일 명령어로 달성할 수 없는 사용자 정의 서버 측 로직을 가능하게 하기 때문에 유익합니다.
Redis 를 사용하여 분산 잠금 (distributed lock) 을 구현하는 방법은 무엇인가요? 고려해야 할 사항은 무엇인가요?
답변:
Redis 는 SET key value NX PX milliseconds를 사용하여 분산 잠금을 구현할 수 있습니다. NX는 키가 존재하지 않는 경우에만 설정되도록 보장하고, PX는 만료 시간을 설정합니다. 고려해야 할 사항으로는 설정 및 만료의 원자성 보장, 잠금 해제 처리 (소유자만 가능), 복잡한 분산 시스템에서의 높은 신뢰성을 위한 Redlock 사용 등이 있습니다.
Redis Hash 를 설명해주세요. 여러 개의 String 키 대신 Hash 를 선택하는 경우는 언제인가요?
답변:
Redis Hash 는 문자열 필드와 문자열 값 간의 맵으로, 객체를 표현하는 데 이상적입니다. 단일 엔티티의 속성을 저장할 때 여러 개의 String 키 대신 Hash 를 선택합니다 (예: 사용자 프로필: user:100:name, user:100:email 대신 HSET user:100 name 'Alice' email 'alice@example.com'). Hash 는 메모리를 절약하고 여러 필드에 대한 원자적 작업을 허용합니다.
Redis 비트맵 (Bitmaps) 의 목적은 무엇인가요? 실제 예시를 들어주세요.
답변:
Redis 비트맵은 문자열 값을 비트 배열로 취급하는 특수 데이터 타입으로, 불리언 정보의 효율적인 저장 및 조작을 가능하게 합니다. 실제 예시는 일일 사용자 로그인 추적입니다: SETBIT user:login:20231026 user_id 1, 여기서 user_id는 비트 오프셋이며, 고유 로그인 수를 빠르게 세거나 사용자 활동을 확인하는 데 사용될 수 있습니다.
Redis 파이프라이닝 (Pipelining) 을 설명해주세요. 성능을 어떻게 향상시키나요?
답변:
Redis 파이프라이닝을 통해 클라이언트는 각 명령의 응답을 기다리지 않고 여러 명령을 서버에 보낼 수 있습니다. 서버는 이를 순차적으로 처리하고 모든 응답을 단일 응답으로 다시 보냅니다. 이는 네트워크 왕복 시간 (RTT) 오버헤드를 크게 줄여 배치 작업의 전반적인 처리량을 향상시킵니다.
Redis 지리 공간 인덱스 (Geospatial indexes) 란 무엇인가요? 유용성에 대한 예시를 들어주세요.
답변:
Redis 지리 공간 인덱스를 사용하면 위도/경도 좌표를 저장하고 쿼리할 수 있습니다. 내부적으로 Sorted Set 을 사용하여 지오해시 (geohash) 를 저장합니다. 사용자는 주어진 반경 또는 경계 상자 내의 지점을 찾는 데 유용하며, 예를 들어 사용자의 위치에서 5km 이내의 모든 식당을 찾거나 근처 관심 지점을 식별하는 데 사용할 수 있습니다.
Redis 는 Pub/Sub (Publish/Subscribe) 메시징을 어떻게 처리하나요?
답변:
Redis Pub/Sub을 통해 클라이언트는 채널을 구독하고 해당 채널에 게시된 메시지를 수신할 수 있습니다. 이는 메시지가 활성 구독자가 없을 경우 지속되지 않는 'fire-and-forget' 메시징 시스템입니다. 메시지 내구성이 주요 관심사가 아닌 실시간 알림, 채팅 애플리케이션 및 이벤트 브로드캐스팅에 사용됩니다.