Redis에 압축 비트맵 형식인 Roaring이 추가될 예정이다. Redis 8.12에 포함될 이 기능은 설정으로 선택해 켤 수 있으며, 정수 집합이 드문드문 분포한 경우 기존 비트맵보다 메모리를 적게 쓰고 일부 연산을 빠르게 처리할 수 있다.

Redis는 메모리 기반 데이터베이스로, 느린 데이터베이스 앞단의 캐시로도 널리 쓰인다. 기존 비트맵은 일반 Redis 문자열에 저장된다. 가장 큰 비트 위치까지 공간을 할당하므로, 40억 번째 위치의 비트 하나만 설정해도 512MB를 사용하고 BITCOUNT나 BITOP은 그 전체를 훑어야 한다.

Roaring은 데이터 분포에 따라 저장 방식을 바꾼다. 드문 구간은 정수 목록으로, 빽빽한 구간은 일반 비트셋으로, 연속된 값은 구간 형태로 저장한다. 압축을 풀지 않고도 개수 세기와 교집합·합집합 연산을 할 수 있다. Roaring 웹사이트는 Elasticsearch, Apache Spark, ClickHouse 등 여러 시스템에서 이 형식을 사용한다고 소개한다.

안토니오 비지아노(Antonio Viggiano)가 Roaring을 Redis에 통합했다. 새 자료형은 TYPE key에서 bitmap, OBJECT ENCODING key에서 bitmap-roaring으로 표시된다. 기본 설정은 선택 사항이며 CONFIG SET bitmap-default-roaring yes로 활성화할 수 있다.

다니엘 르미르(Daniel Lemire)는 병합 커밋으로 빌드한 Redis를 Intel Xeon Gold 6548N의 코어 하나에서 실행해 비교했다고 밝혔다. 각 작업 부하에서 같은 내용의 비트맵 두 개를 문자열 형식과 Roaring 형식으로 각각 만들고 명령 실행 시간을 쟀다. 비교 대상은 1억 개 중 무작위 ID 10만 개, 무작위 ID 5천만 개, 1억 개 범위에서 연속된 값 100만 개씩으로 이뤄진 구간 10개, 그리고 무작위 32비트 값 10만 개였다. 마지막 경우 문자열 비트맵은 512MB를 차지한다.

르미르의 측정에서는 일부 작업에서 Roaring이 압축되지 않은 비트맵보다 훨씬 빨랐으며, 특히 32비트 해시 ID 사례에서 차이가 두드러졌다고 한다. 다만 구체적인 실행 시간 수치는 제시하지 않았다. 압축 비트맵이 언제나 더 나은 것은 아니며, 선택에는 여러 절충점이 있다고 르미르는 덧붙였다.

Redis의 Roaring 비트맵 소개 글