독서/개발자를 위한 레디스

[개발자를 위한 레디스] 4장 레디스 자료 구조 활용 사례

sohyeon_v 2024. 10. 6. 20:53
반응형
SMALL

레디스가 제공하는 다양한 자료 구조를 적절히 활용한다면 애플리케이션에서는 매우 짧은 대기 시간으로 엄청난 양의 작업을 처리할 수 있다.

 

sorted set을 이용한 실시간 리더보드

  • 사용자의 증가에 따라 가공해야 할 데이터가 몇 배로 증가한다.
  • 데이터가 실시간으로 반영되어야 한다.
  •  
  • 여러 가지 수학적 계산이 빠르게 수행되어야 한다.

 

  • sorted set에서 데이터는 저장될 때부터 정렬되어 들어간다.

 

데이터 저장 및 조회

  • ZADD 커맨드를 활용해서 데이터(스코어, 플레이어 번호)를 저장한다.

 

  • ZRANGE를 활용해서 스코어 낮은 순서로 데이터를 조회할 수 있다.
  • ZREVRANGE를 활용해서 상위 스코어 N개 데이터를 조회할 수 있다.

 

  • ZADD를 활용해서 기존 플레이어의 점수 데이터 업데이트가 가능하다.
  • set 자료구조는 기본적으로 데이터의 중복을 허용하지 않는다.

 

  • ZINCRBY를 활용해서 스코어 데이터의 증감도 가능하다. (증감 후 데이터 재정렬)

 

랭킹 합산

  • 주간 리더보드는 매주 월요일마다 초기화된다고 가정한다. 기준 날짜를 24.10.02(화)라고 하면, 24.09.30(월)~24.10.02(화)까지의 합산 결과가 필요하다.
  • ZUINONSTORE를 활용하여 합산 가능하다.

 

  • 실제로 커맨드를 활용하여 데이터를 합산하는 과정이다.
  • weekly-score:2410-1을 확인해보면 합산된 데이터 순서로 정렬되어 있다.

 

  • weights를 활용하여 특정한 날(키)에 가중치를 줄 수도 있다.

 


sorted set을 이용한 최근 검색 기록

검색 기록의 요구사항은 다음과 같다.

  • 유저별로 다른 키워드 노출
  • 검색 내역은 중복 제거
  • 가장 최근 검색한 5개의 키워드만 사용자에게 노출

 

  • 쇼핑몰에서의 최근 검색 내역이다.
  • 스코어로 시간을 활용해서 검색 기록으로 정렬할 수 있다.

 

  • 실제 데이터를 저장하고, 최근 5개 데이터를 조회할 수 있다.
  • 같은 키워드로 검색해도 중복되지 않는다. (set 자료구조 특징)
  • 데이터를 저장(ZADD)할 때마다 음수 인덱스 -6번째를 삭제하는 로직을 추가하면 실시간으로 데이터 5개를 유지하며 삭제할 수 있다.

 


sorted set을 이용한 태그 기능

게시글 기준으로 태그를 추가할 수 있다.

 

태그를 기준으로 게시글을 추가할 수 있다.

 


랜덤 데이터 추출

  • 레디스를 사용하면 O(1)의 시간 복잡도를 이용해 랜덤한 데이터를 추출할 수 있다. (RANDOMKEY 커맨드 활용)
    • hash: HRANDFIELD 커맨드 활용
    • set: SRANDMEMBER 커맨드 활용
    • sorted set: ZRANDMEMBER 커맨드 활용

 


레디스에서의 다양한 카운팅 방법

좋아요 처리하기

  • 댓글 id를 기준으로 set을 생성한 뒤, 좋아요를 누른 유저의 id를 set에 저장하면 중복 없이 데이터를 저장할 수 있다.
  • 각 댓글별로 좋아요를 누른 수는 SCARD 커맨드로 확인할 수 있다.

 

읽지 않은 메시지 수 카운팅하기

  • 채팅 메시지가 도착할 때마다 데이터를 인메모리 데이터베이스(레디스)에 일시적으로 저장한 뒤 필요한 시점에 한번에 DB를 업데이트 하는 방식을 사용하면 부하를 최소화할 수 있다.

 

  • hash 구조를 활용하여 카운트를 효과적으로 관리할 수 있다.
  • 사용자의 ID를 키로 사용하고, 채널의 ID를 아이템의 키로 활용해 숫자 형태 메시지 카운트로 관리할 수 있다.
  • ID가 234인 사용자가 4234 채널에서 새로운 메시지를 수신했다면 아래 명령어를 사용할 수 있다.
    • HINCRBY user:234 channel:4243 1
  • 이미 전송한 메시지를 삭제했다면 아래 명령어를 사용할 수 있다.
    • HINCBY user:123 channel:3135 -1

 

DAU 구하기

  • 비트맵을 활용하여 메모리를 효율적으로 줄이고, 실시간으로 서비스의 DAU를 확인할 수 있다.

 

  • SETBIT를 통해 방문한 유저 수를 업데이트 한다.
    • 2024년 10월 6일, id가 14인 유저가 접근했을 때 오프셋 14를 1로 설정한다.
  • BITCOUNT를 통해 해당 일자에 접근한 유저 수를 확인할 수 있다.
  • BITOP AND를 통해 조건에 따라 연속 출석한 유저의 정보도 구할 수 있다. 해당 정보는 새로운 비트맵 자료 구조에 저장할 수 있고, 리스트로 변환하여 정보를 확인할 수 있다.

 

hyperloglog를 이용한 애플리케이션 미터링

  • 미터링 솔루션은 사용자의 서비스 사용 내역을 이용하기 때문에 대용량 데이터를 처리할 수 있어야 한다.
  • 다음 조건을 만족한다면 hyperloglog 사용을 고려해볼 수 있다.
    • 집합 내의 유일한 데이터의 개수를 카운팅해야 한다.
    • 1% 미만의 오차는 허용 가능하다.
    • 카운팅할 때 사용한 정확한 데이터를 다시 확인하지 않아도 된다.

 

  • 예를 들어, 2024년 10월에 ID가 245인 유저의 API 호출 횟수를 계산하려면 API를 호출할 때마다 해당 키에 PFADD 커맨드를 사용해 로그 식별자를 저장한다.
  • PFCOUNT를 통해 중복되지 않은 데이터의 개수를 조회할 수 있다.
  • hyperloglog는 set과 비슷하지만 저장되는 용량은 12KB로 고정되기 때문에 공간을 효율적으로 사용할 수 있다.
  • PFMERGE를 통해 여러 개의 hyperloglog를 합칠 수도 있다.
    • PFMERGE 2024:user:245 202410:user:245 202411:user:245 202412:user:245

 


Geospatial Index를 이용한 위치 기반 애플리케이션 개발

위치 데이터란

  • 사용자의 현재 위치 파악
  • 사용자의 이동에 따른 실시간 변동 위치 업데이트
  • 사용자의 위치를 기준으로 근처의 장소 검색

 

레디스에서의 위치 데이터

  • geo 자료 구조를 통해 공간 정보 데이터를 처리할 수 있다.
  • 메모리에서 빠르게 계산할 수 있어 다른 저장소보다 위치 데이터를 효율적으로 처리할 수 있다.
  • geo set
    • 위치 공간 관리에 특화된 데이터 구조로, 각 위치 데이터는 경도와 위도의 쌍으로 저장된다.
    • GEOADD 커맨드를 사용해서 데이터(사용자의 현재 위치)를 추가할 수 있다. (위치 변경 시에도 활용)
    • GEOPOS 커맨드로 저장한 데이터를 조회할 수 있다.
    • GEOSEARCH 커맨드로 특정 거리 내에 있는 위치를 찾을 수 있다.
      • BYRADIUS 옵션을 활용하면 원 모양의 반경으로 찾을 수 있다.
      • BYBOX 옵션을 사용하면 가로/세로 값을 지정하여 직사각형 모양의 반경으로 찾을 수 있다.

 


References

개발자를 위한 레디스

반응형
LIST