무비 위키 메인 화면에 인기리스트를 띄워주기 위해 Redis의 Sorted Set을 사용해보았다.
기존에는 특정 영화를 검색해서 조회하면 db에 해당 영화의 movieId를 참조하여 view 컬럼의 숫자를 1 증가시켜주고
그 숫자를 기준으로 내림차순 정렬해 상위 5개의 영화를 메인 화면에서 보여주고 있었다.
거기에 실시간 현황을 반영해 주기 위해 방법을 약간 바꾼 것이다.
Sorted Set (Zset)이란?
정렬된 집합으로 값을 정렬된 순서로 저장하면서 각 값에 고유한 식별자인 score를 부여하는 데이터 구조이다.
sorted set은 key-value 구조로 되어 있는데 key는 문자열이며 value는 정렬된 순서로 저장되는 요소들의 집합니다.
각 요소는 고유한 member로 식별되며 member와 score는 일대일로 매핑된다.
member - score 쌍은 sorted set에서 정렬 및 고유성을 제공하는 주요 요소이다.
sorted set을 사용한 이유
- 정렬된 순서
: member의 score에 따라 정렬되어 저장된다. 따라서 값을 쉽게 순서대로 조회할 수 있다. - 고유성
: 각 member는 고유한 식별자로 집합 내에서 중복된 값을 가질 수 없다. - 랭킹
: member의 순위 정보를 제공한다. member는 점수를 기준으로 랭킹이 매겨지며, 높은 점수일수록 높은 순위를 가진다. 이를 활용해 순위 기반의 검색이나 랭킹 시스템을 구현할 수 있다.
사용자가 특정 영화를 검색했을 때
movieId는 member에 해당하고 score는 사용자가 해당 영화를 검색한 횟수이다.
redis의 zscore 명령어를 이용해 'rank'라는 sorted set에 해당 member(movieId)의 score(검색횟수)를 찾는다.
해당 score에 +1을 해준다.
expire 명령어를 사용해 해당 자료의 TTL (Time To Live)은 15분으로 설정한다.
const movie_score = await this.redis.zscore('rank', `${movieId}`);
await this.redis.zadd('rank', Number(movie_score) + 1, `${movieId}`);
await this.redis.expire('rank', 900);
저장된 데이터 확인
redis insight를 사용하여 저장된 데이터를 확인해보았다.
해당 데이터 셋에서 movieId는 member 컬럼에, 검색 횟수는 score에 저장된다.
영화의 검색 순위 추출
redis의 zrevrange명령어를 사용해
'rank'라는 sorted set에서 score 기준으로 내림차순하여 5개의 데이터를 배열 형태로 가져온다.
const realTimePopularRankTopFive = await this.redis.zrevrange('rank', 0, 4);
몇 줄의 코드를 추가하여 손쉽게 인기검색어를 검색량 기준으로 원하는만큼 정렬하여 가져올 수 있었다.
출처 및 참조
'Development > TIL' 카테고리의 다른 글
스트레스 테스트2 (feat. 배포 서버 다운) (0) | 2023.06.27 |
---|---|
스트레스 테스트 (feat. artillery) (0) | 2023.06.24 |
Nest.js 클러스터링 (0) | 2023.06.21 |
비교 단위별 Diff 및 Patch 코드 동작 속도 측정 (0) | 2023.06.16 |
patch 알고리즘 수정 (feat. </p> 태그 지옥) (0) | 2023.06.16 |