본문 바로가기
DataOps/Redis

[Redis] 4장. 레디스 자료 구조 활용 사례

by BenKangKang 2024. 5. 5.

실시간 리더보드

배경

  • 리더보드: 경쟁자들의 순위와 현재 점수를 보여주는 순위표
    • 절대적 리더보드
      • 모든 유저를 정렬시켜 상위권만 표시하는 것을 absolute leaderboard 라고 함
    • 상대적 리더보드
      • 사용자마다 다른 데이터를 보여줌
        • 구로 직장인 대상 순위

필요

  • 상대적 리더보드의 경우 다양한 관점에서 데이터 계산하고 통계 내야하기 때문에 여러 가지 수학적 계산이 빠르게 수행되어야 함
  • 관계형 데이터베이스 사용할 경우 항상 정렬해서 가져와야 한다.

해결

  • Sorted set 은 항상 정렬해서 저장하기 때문에 매번 정렬할 필요가 없다.
  • ZUIONSTORE로 스코어 합한할 수 있음
  • 특정 SET 에 가중치 줄 수 있음

최근 검색 기록

배경

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

필요

  • 관계형 데이터베이스 사용할 경우 아래와 같은 귀찮음이 있음
    • 검색 기록 있는지 확인
    • 오래된 기록 삭제
    • 최근 순 소팅

해결

  • Sorted set 사용해서 해결
    • Set이기 때문에 자동으로 중복 해결
    • 자동으로 시간 순 정렬 (스코어로 날짜)
    • ZREMRANGEBYRANK 로 몇 개 이상 데이터가 남지 않도록 설정

태그 기능

배경

  • 태그 검색 구현해야 함

필요

  • 관계형 데이터베이스로 하려면?
    • 방법
      • 태그 문자열 검색
      • 태그 테이블 분리해서 검색
    • 문제점
      • 멀티 태그 검색을 위한 group by -having 절 사용할 경우 데이터베이스 자체에 부하를 발생시킬 수 있다.
      SELECT post_id
      FROM tag_post
      WHERE tag_id IN (1, 3)
      GROUP BY post_id
      HAVING count(tag_id) <= 2;
      

해결

  • SADD
    • 태그 추가
  • SMEMBERS
    • 태그 가지고 있는 게시글 검색
  • SINTER
    • 여러개의 태그에 동시에 속한 게시글 교집합으로 검색

랜덤 데이터 추출

배경

  • 게임에서 랜덤 유저 매치, 이벤트 응모 유저 랜덤 추출
  • 가챠에서 랜덤 아이템 뽑기 구현

필요

  • ORDER BY RAND() 함수는 조건 절에 해당하는 모든 행 읽은 뒤 랜덤 limit 까지 데이터 추출하기 때문에 데이터가 많은 경우 부하가 많이 갈 수 있음

해결

  • RANDOMKEY 사용해서 전체 키 중 하나를 무작위로 반환할 수 있으며 O(1) 로 가능하다.
  • 아래 커맨드로 자료 구조에서 랜덤 아이템 추출할 수 있다.
    • HRANDFIELD: Hash
    • SRANDMEMBER: Set
    • ZRANDMEMBER: Sorted Set

대규모 카운팅

좋아요

  • Set 으로 해결

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

  • 해시로 해결

Daily Active User

  • 유저 Id 저장하는 방식 적용할 경우 데이터가 너무 많아 성능 저하 발생할 수 있음 -> 비트맵으로 해결 → id로 0이상의 정수값 사용할 때만 가능
  • 1첫만명 → 1천만 개 비트, 1.2MB 크기에 해당 (string 최대는 512MB)
-- id가 14인 유저 방문했다고 비트에 표시
SETBIT uv:20221106 14 1 
  • 응용해서 매일 출석 유저 구할 수 있음

해결

  • 매번 요청하지 않고, 카운팅을 레디스에서 몰아서 집계했다가 데이터베이스에 한 번에 업데이트 하도록 개선

위치 기반 애플리케이션

배경

필요

  • 관계형 데이터베이스는 데이터 처리를 저장소 외부에서 처리하지만 레디스는 실시간 위치 연산을 직접 수행할 수 있다 → 이게 과연 장점인가?
    1. 데이터 이동으로 인한 네트워크 트래픽 감소
    2. 애플리케이션 코드 복잡성 감소
    3. 빠른 서비스 응답 속도 보장(?)

해결

  • 레디스 GEO 자료 구조를 통해 공간 정보 데이터 처리
  • geo set + pub/sub 조합하면 맛집에서 이벤트 발생했을 때 근처 사용자에게 알림 보낼 수 있음

댓글