레디스의 Bitmap 데이터타입을 이용해 메모리 크기를 줄인 사례를 공유해봅니다
안녕하세요. 리멤버 코어Server파트의 서버개발자, 노아론입니다
지난 금요일, 리멤버 기술 블로그에
리멤버 서버에서 사용하고 있는 기술 스택 중 하나인 레디스(Redis)의 Bitmap 데이터 타입을 주제로 글을 작성했습니다.
IT엔지니어 커뮤니티에 이 내용을 공유하면 좋겠다 싶어 글을 작성해봅니다.
레디스는 오픈소스 인메모리 데이터 구조의 저장소로, 데이터베이스나 캐시, 메세지 브로커로 이용할 수 있으며 많은 기업에서 사용하고 있습니다.
원자성(Atomic)의 동작을 보장하고, String 타입 뿐 아니라 Set, List, Hash, Sorted set, Geo 등의 다양한 데이터 타입을 지원하고 있는데요
많은 데이터 타입 중에서, 이번에 Bitmap을 이용해 개선한 사례를 공유드려봅니다.
혹시 리멤버에서 설문조사를 하고 리워드를 받아보신 적 있나요?
리멤버 리서치라는 서비스로 이를 제공하고 있는데요, 리서치의 서버를 개발하면서 겪었던 문제점이 있었습니다.
리멤버 리서치의 설문을 참여 해보셨다면 회사 동료 혹은 지인 분이 리멤버에서 설문을 하고 리워드를 받는 것을 보고, 설문에 따라 들어갔지만 자신에겐 설문이 뜨지 않아서 아쉬워 하셨을 적도 있었을 것입니다.
이는 보다 정확한 응답을 얻고자 사용자의 커리어 정보를 기반으로 타겟팅하기 때문입니다.
이렇게 타겟팅하고 해당하는 설문만 보이도록 서버에서 처리하는 과정에서
처음엔 Redis의 Set을 통해 리멤버에서 가지고 있는 사용자의 고유 ID를 저장하게 설계하였는데요, 그러나 이 방법은 참여 모수가 커질수록 Redis의 메모리 공간을 크게 소모하는 문제점이 있었습니다.
그래서 이 문제를 해결하기 위해서, Redis Bitmap 구조를 사용하였습니다.
레디스 공식 문서에서도 Bitmap을 사용한다면 Set구조를 이용해 정수 0부터 N까지의 멤버를 표현하는 경우를 효율적으로 처리할 수 있다고 설명하고 있습니다.
결과적으로 명령어에 대한 시간 복잡도를 O(1), 즉 상수 시간에 처리하면서 메모리 크기는 75만명 기준으로 1/300 크기로 줄일 수 있었습니다.
지난 금요일에 업로드한 리멤버 기술 블로그의 글입니다.
https://lnkd.in/g8SAtfHB
레디스의 공식 문서에서의 내용이 궁금하시다면, 아래 링크를 통해 확인할 수 있습니다.
https://redis.io/docs/data-types/bitmaps/
글을 읽으면서 궁금한 점이 있다면, 이 글 혹은 리멤버 기술 블로그에 있는 댓글에서 작성해주시면 답변드리도록 하겠습니다
긴 글 읽어주셔서 감사합니다!