Data Structure Use Case(자료 구조 활용 사례)
Data Structure Use Case(자료구조 활용 사례)
Sorted Set - 실시간 리더보드
랭킹 산정 과정에서 가중치를 부여할 수 있고, 실시간으로 랭킹을 집계해야하는 경우엔 RDBMS는 성능 이슈가 존재할 수 있다. 이러한 요구사항을 충족시키기 위해선 Sorted Set이 가장 적합한데, 데이터가 저장될 때부터 정렬되어 있기 때문에 랭킹을 산정하는데 유리하다.
Score에 가중치를 부여해 랭킹을 산정
ZADD 커맨드를 통해 데이터를 추가 및 갱신하여 항상 정렬된 상태로 유지
ZRANGE / ZREVRANGE 커맨드를 통해 특정 범위의 데이터를 조회
랭킹 합산
리더보드가 일정 기간마다 초기화 된다고 할때, 다음과 같은 방법으로 랭킹을 합산하려 시도해볼 수 있다.
일별로 랭킹을 저장하는 Sorted Set을 생성
하나의 테이블에서 일별로 저장된 데이터를 모두 가져온 뒤 사용자별로 합산
합산된 값을 정렬하여 랭킹을 산정
하지만 레디스의 ZUNIONSTORE
커맨드를 사용하면 더욱 간단하게 랭킹을 합산할 수 있다.
Sorted Set - 최근 검색 기록
이 기능을 일반적은 RDBMS로 구현하면 아래와 같은 쿼리로 구현해볼 수 있다.
여기서 중복 검색어 제거 및 오래된 검색 기록 삭제 등 여러 작업이 추가적으로 필요할 수 있어 복잡해질 수 있다.
하지만 Sorted Set을 사용하면 아래와 같은 이유로 간단하게 구현 할 수 있다.
Set이기 때문에 저장될 때부터 중복을 허용하지 않음
Score에 시간을 부여해 자동으로 정렬되어 저장
키 값은
serach-keyword:<user_id>
로 저장하여 사용자별로 구분하여 저장데이터 삭제는
ZREMRANGEBYRANK search-keyword:<user_id> -6 -6
커맨드를 이용해 특정 범위의 데이터를 삭제
Sorted Set - 태그
특정 오브젝트에 대한 태그를 지정하는 기능이 추가될 수 있는데, RDBMS로 구현하면 적어도 두 개의 테이블이 추가로 필요하다.
태그 테이블
태그-오브젝트 매핑 테이블
마찬가지로 레디스의 Set을 사용하면 아래와 같은 이유로 간단하게 구현 할 수 있다.
또한, 특정 태그를 가진 오브젝트를 조회하는 경우에도 아래와 같이 간단하게 조회할 수 있다.
랜덤 데이터 추출
보통 RDBMS에서 랜덤 데이터를 추출할 때에는 ORDER BY RAND()
를 사용하는데, 다량의 데이터를 처리할 경우 성능 이슈가 발생할 수 있다.
하지만 레디스를 사용하면 아래와 같이 간단하게 랜덤 데이터를 추출할 수 있다.
다양한 카운팅 방법
데이터 개수를 세는 요구 사항은 다양한 방법으로 구현할 수 있는데, 요구 사항에 따라 최적의 구현 방법을 선택해야 한다.
단순히 데이터 개수만 세는 경우
어떤 아이템이 저장됐는지까지 알아야 하는 경우
약간의 오차를 허용하면서 빠르게 데이터 개수를 세는 경우
좋아요 처리
좋아요 처리는 규모에 따라 많은 트래픽이 발생할 수 있으며, 한 사용자가 중복으로 좋아요를 누르는 경우를 방지해야 한다. 이를 위해 레디스의 Set을 사용하면 아래와 같이 간단하게 구현 할 수 있다.
읽지 않은 메시지 개수
읽지 않은 메시지는 중복된 데이터를 고려할 필요 없이 단순히 개수만 세면 되기 때문에 해시를 사용하면 아래와 같이 간단하게 구현 할 수 있다.
DAU
DAU는 다른 데이터들보다 훨씬 큰 숫자를 처리해야함과 동시에 중복을 허용하지 않아야 한다. Set을 저장하는 방법을 고려해볼 수 있다면, 너무 많은 데이터를 저장해야하기 때문에 메모리 사용량이 증가하고, 성능 저하로 이어질 수 있다.(보통 키 하나당 200~300만개까지 권장)
때문에 다른 방법을 사용해야하는데, String 자료 구조에 Bit 연산을 수행하여 해결할 수 있다.(사용자 id는 정수값이어야 함)
Geospatial - 위치 기반 애플리케이션
위치 데이터는 주로 경도와 위도 좌표 쌍으로 표현되며, 보통 위치 기반 애플리케이션은 다음과 같은 기능을 제공하고 있다.
사용자의 현재 위치 파악
사용자의 이동에 따른 실시간 위치 업데잍츠
사용자 위치 기준으로 주변 정보 제공
일반적인 데이터 저장소는 단순히 위치 데이터를 저장하는 것으로 끝나지만, 레디스의 Geospatial 자료 구조를 사용하면 다음과 같이 더욱 효율적으로 처리할 수 있다.
참고자료
Last updated
Was this helpful?