본문 바로가기

Development/TIL

Redis Sorted Set (Zset)

무비 위키 메인 화면에 인기리스트를 띄워주기 위해 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을 사용한 이유

  1. 정렬된 순서
    : member의 score에 따라 정렬되어 저장된다. 따라서 값을 쉽게 순서대로 조회할 수 있다.
  2. 고유성
    : 각 member는 고유한 식별자로 집합 내에서 중복된 값을 가질 수 없다.
  3. 랭킹
    : 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);

 

 

몇 줄의 코드를 추가하여 손쉽게 인기검색어를 검색량 기준으로 원하는만큼 정렬하여 가져올 수 있었다.

 

 

 

출처 및 참조

https://velog.io/@top1506/Redis%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B8%EA%B8%B0%EA%B2%80%EC%83%89%EC%96%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0Nest-js

 

Redis를 이용한 인기검색어 만들기(Nest js)

다음과 같은 인기검색어를 구현하는 것이 목적입니다.시스템 자체는 비교적 간단하게, 사용자가 검색어를 입력하면, 해당 검색어랑 관련된 데이터들을 api요청을 통해 가져오게 되고, 이를 서버

velog.io

https://velog.io/@chaerim1001/Redis-NestJS-Sorted-set%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%9E%AD%ED%82%B9-%EA%B5%AC%ED%98%84

 

Redis의 Sorted set을 사용하여 랭킹 기능 구현하기

Redis의 sorted set을 이용해서 랭킹 기능을 구현하기

velog.io