redis sorted set 사용

임종혁·2024년 12월 23일

redis sorted set 이용


실시간 리더 보드 이용


  • 리더보드는 사용자의 스코어 기반으로 데이터를 정렬하는 서비스

    • 즉 사용자의 증가에 따라 가공해야할 데이터가 몇 배로 증가
    • 상대적 리더보드는 다양한 그룹 관점에서 데이터를 계산해야하고
    • 주간 리더보드는 한주간 사용자 스코어를 합산해 순위를 매겨야 한다
  • sorted set 에서 데이터를 저장할때에는 ZADD 커맨드를 사용한다

ZADD daily-score:220817 28 player:286
ZADD daily-score:220817 400 player:234
  • 순서 없이 데이터를 저장하더라도 sorted set에는 데이터 스코어 순으로 저장된다

  • ZRANGE 커맨드를 이용하면 스코어를 오름차순으로 정렬되어 확인할 수 있다.

ZRANGE daily-score:220817 0 -1 withscores

"player:286"
"28"
"player:101"
"45"
  • ZRANGE는 스코어가 낮은 순서부터 출력하낟

  • 상위 유저스코어 출력하고 싶을시

    • ZREVRANGE 커맨드를 사용하면 된다
ZREVRANGE daily-score:220817 0 2 withscores
"player:234"
"400"
"player:24"
"357"
  • ZADD 가 기존 존재하는 키에 유저가 있으면 스코어가 업데이트 된다

    • sorted set은 기본적으로 set이기 때문에 데이터는 중복으로 저장되지 않는다
      • 즉 신규 스코어로 저장된다
      • 스코어가 업데이트되면 그에 맞춰 데이터의 순서도 다시 정렬된다
  • 직접 스코어 값을 지정해서 변경하지 않고도

    • ZINCRBY 커맨드 이용해서 SORTED SET 내의 스코어를 증감 시킬 수 있다.
ZINCRBY daily-score:220817 100 player:24
// player:24 100 증가 
  • 관계형 데이터베이스만 이용해 실시간 차트 서비스를 구현하는 것은 까다로운 작업
    • 모든 유저의 변경 데이터는 실시간 업데이트 돼야 함
    • 정렬해서 가져오는 작업 자체가 관계형 데이터베이스에 상당히 부하 줄 수 있음
      • 즉 유저가 증가할 수록 배로 증가

랭킹 합산


  • 관계형 데이터베이스에서 주간 누적 랭킹을 구현하려면 하나의 테이블에서 일자에 해당하는 데이터를 모두 가져온 뒤 선수별로 합쳐야함 그리고 다시 소팅하는 작업 필요

  • sorted set 사용시 ZUIONSTORE 커맨드를 이용

    • 지정된 키에 연결된 각 아이템을 스코어로 합산하는 커맨드

→ 내가 생각하는 REDIS 를 활용해야 하는 큰 이유

ZUIONSORE 생성할 키 이름 합산할 키 개수 합산할키

ZUNIONSTORE weekly-score:2208-3 3 daily-score:220815 daily-score:220816 daily-score:220817
  • 또한 가중치 (2배 이밴드 적용도 가능하다)
ZUNIONSTORE weekly-score:2208-3 3 daily-score:220815 daily-score:220816 daily-score:220817 weights 1 2 1

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


  • 관계형 데이터베이스일시
    • 유저별로 다른 키워드 노출
    • 검색 내역 중복 제거
    • 가장 최근 검색한 5개 키워드만 사용자에게 노출
SELECT * FROM keyword WHERE user_id = 123 ORDER BY reg_date DESC LIMIT 5;

우저가 최근에 검색했던 테이블 최근 5ㅐㄱ 조회

  • 이때는 테이블에 저장할때 기존에 사용자가 같은 키워드를 검색했는지 확인 한 뒤 업데이트 하는 작업 필요하며

  • 테이블에 데이터가 무기한으로 쌓이는 것을 방지하기 위해 주기적 배치 작업을 돌려 오래된 검색 기록은 삭제하는 작업 필요

  • 데이터를 가져올 때 검색한 시점 기준으로 소팅을 해야하기 때문에 사용자와 검색 기록이 늘어날 수록 많은 데이터를 테이블에서 관리해야한다는 문제

  • Sorted set 이용시 set이기 때문에 저장될 때부터 중복 허용하지 않ㅇ므

  • 스코어를 시간을 이용한다면 검색 기록으로 정렬될수 있다.

0개의 댓글