본문 바로가기

CS/데이터베이스

Redis에 대해서 -6

Redis의 Set 자료구조 내부 동작 방식과 저장 전략

Redis에서 Set은 중복되지 않는 원소들의 집합을 저장하는 자료구조로, 순서가 없으며 특정 값의 존재 여부를 빠르게 확인할 수 있는 특징이 있다. Redis는 이러한 Set을 내부적으로 다양한 방식으로 저장하며, Set의 크기와 저장되는 값의 특성에 따라 최적의 자료구조를 자동으로 선택하여 성능과 메모리 효율을 극대화한다.

Redis가 Set을 저장할 때 사용하는 내부 자료구조와 그 동작 방식

먼저 Redis의 Set은 정확히 세 가지 내부 구현 구조를 가진다. 바로 intset, hashtable, 그리고 Bitmaps과 같은 특별한 경우이다. 흔히 잘못 이해하는 것과 달리, Set은 링크드 리스트를 내부 저장 구조로 사용하지 않는다. 링크드 리스트는 Redis의 List 타입에서 사용되는 구조이며, Set의 경우엔 전혀 다르게 동작한다.

Redis는 작은 Set을 저장할 때 intset이라는 특수한 인코딩 형식을 사용한다. intset은 정수 값만 저장할 수 있는 배열 기반의 자료구조로, 매우 메모리 효율적이다. 정수형 값으로만 구성된 Set이며, 요소의 수가 set-max-intset-entries 설정값(기본 512) 이하일 때 intset으로 저장된다. 이 구조는 삽입과 삭제에는 상대적으로 느릴 수 있지만, 매우 작은 메모리 풋프린트를 가지므로 적은 수의 정수 데이터를 저장할 때는 이상적인 구조이다.

Set이 커지거나 정수가 아닌 문자열이 포함되기 시작하면, Redis는 즉시 내부 구조를 hashtable로 전환

hashtable은 우리가 일반적으로 알고 있는 해시 테이블 구조로, 해시 함수를 통해 고유한 인덱스를 계산하여 데이터를 저장한다. 이 방식은 원소 수에 관계없이 평균적으로 O(1)에 가까운 시간 복잡도로 삽입, 삭제, 검색이 가능하므로, 대규모 데이터셋을 처리할 때 매우 효율적이다. 또한 해시 테이블은 자동적으로 중복을 제거하고 유일한 값만 저장하는 특성을 가지고 있어 Set의 본질적인 특성과 잘 부합된다.

비트맵은 Redis의 Set 내부 저장 구조로 사용되는 것은 아니지만, 일부 상황에서는 Set의 대체 용도로 비트맵을 사용하는 것이 효과적일 수 있다. 예를 들어 수백만 개의 사용자 중 특정 사용자의 로그인 여부 또는 특정 기능 사용 여부를 추적해야 할 경우, 각 사용자의 상태를 하나의 비트로 매핑하여 표현할 수 있다. 이처럼 값의 범위가 고정되어 있고 상태가 이진으로 표현될 수 있다면, 비트맵은 매우 적은 메모리만으로도 대규모 데이터를 효율적으로 관리할 수 있다. Redis는 이를 위해 SETBIT, GETBIT, BITFIELD, BITCOUNT 등의 명령어를 제공한다. 하지만 다시 강조하자면, 비트맵은 Set의 내부 구조가 아니라 별도의 자료형이자 사용 방식이다.

Redis는 이러한 내부 자료구조 전환을 사용자 개입 없이 자동으로 수행한다. 예를 들어 처음에는 정수만 저장되어 intset을 사용하다가 문자열이 삽입되거나, 정수의 개수가 일정 수를 넘어서면 자동으로 hashtable로 전환된다. 이 전환은 Redis 내부의 encoding 값으로 구분되며, OBJECT ENCODING myset 명령을 통해 현재 사용 중인 인코딩 방식을 확인할 수 있다. 이러한 동적 전환 방식은 Redis가 다양한 상황에서 일관되게 높은 성능을 발휘할 수 있도록 돕는다.

요약하자면, Redis의 Set은 작은 정수 집합일 때는 intset, 그 외에는 hashtable을 통해 데이터를 저장하며, 비트맵은 특정 조건 하에서 Set의 기능을 대체하기 위한 별도 옵션으로 존재한다.

링크드 리스트는 Set의 내부 저장 방식이 아니며, 혼동해서는 안 된다. 또한 이러한 저장 구조 선택은 Redis가 자동으로 수행하므로 사용자는 자료 구조 선택에 대해 크게 신경 쓸 필요는 없지만, 구조적 차이를 이해하고 있는 것은 성능 최적화 측면에서 매우 중요하다.

Redis의 내부 자료구조에 대한 깊은 이해는 단순히 데이터를 저장하고 조회하는 수준을 넘어, 시스템의 성능 병목을 파악하고 최적화 방향을 결정하는 데 큰 도움이 된다.

특히 대규모 트래픽을 처리하는 백엔드 시스템에서는 자료구조의 선택이 단위 시간당 처리량에 직결되므로, 이러한 구조적 특성을 제대로 이해하고 사용하는 것이 실무에서 중요한 차이를 만들어낸다.

'CS > 데이터베이스' 카테고리의 다른 글

MySQL의 기본 -2  (0) 2025.06.01
MySQL의 기본(이해가 필요한 내용 다시 읽어보기) -1  (0) 2025.06.01
Redis에 대해서 -5  (0) 2025.05.29
Redis에 대해서 -4  (0) 2025.05.29
Redis에 대해서 -3  (0) 2025.05.29